取消继承自 std::basic_string
Un-inherit from std::basic_string
基本上,我有一个大型项目,它使用从std::basic_string<char>
继承的自定义实用程序类c_string
。出于多种原因,我想编辑这个类,以便
- 它不是从
std::basic_string<char>
派生出来的 - 我不必重新实现所有功能
- 我不必触摸每个使用
c_string
的文件
所以我想从:
class c_string : public std::basic_string<char>
{
public:
typedef std::basic_string<char> Base;
c_string() : Base() {}
}
自:
class c_string
{
...
public:
...
c_string() {...}
}
所以,我想知道是否有人有一个好的策略来以最小的影响进行这种改变。
如果你的类在std::string
上添加了自定义功能(你的项目需要),那么你就不走运了:你要么必须封装std::string
(并实现所有方法以转发到std::string
实现),要么从std::string
继承(从std::string
继承通常不是一个好主意)。
如果您的类没有在 std::string
上添加额外的功能,则class c_string { ... }
替换为 typedef std::string c_string;
。
您还可以做另一件事,那就是用私有继承更改公共继承。这样做,你会得到一堆编译错误,因为字符串的所有成员函数现在都是你的类的客户端私有的。然后,您可以有选择地公开以下内容:
class my_string: std::string {
public:
typedef std::string base; // convenience
using base::const_iterator;
using base::begin;
using base::end;
};
你应该理解私有派生不是"my_string是一个 std::string",而是"my_string 是根据 std::string 实现的"。此技术避免了从不打算成为基类的类型(如 std::string)派生的一些缺点(隐式转换、切片等)。进行此转换很容易,它只是工作,几乎没有破坏任何东西的风险。不过,之后,您可以控制转发的接口,这使得转换和重构变得更加容易。
我看不出有什么方法可以避免至少包装所有函数。 最直接的方法是拥有一个私有basic_string成员,并编写在该成员上调用相同函数的包装器。
我遇到了与zdp几乎相同的问题。不继承自 std::string 导致很多代码不使用方法(我们有很多这样的方法)作为 void Foo(字符串 &s_),其中字符串是函数中的参数,用户将my_string 添加到 Foo()。简而言之:从 std::string 继承,您可以将my_string发送到任何以 my_string OR std::string 作为参数的函数。我想重写我的my_string类,但是有很多代码在其他人手中有这个问题,很多人也必须更改他们的代码。14年前的一个糟糕选择。.sh。。
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 如何更改大小(std::string)
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- std::string 的对象真的可以移动吗?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- <string> 使用 for 循环写入向量