类std :: wstring缺少"普通"c字符串(和文字)的一些操作.
我想在我自己的自定义类中添加这些缺少的操作:
#include <string>
class CustomWString : public std::wstring {
        public:
            CustomWString(const char*);
            const char* c_str(void);
};
上面的代码在使用g ++ v4.4.1的Ubuntu Karmic上编译得很好.
但我想知道是否有反对这样做的论据?
编辑:一些例子来澄清我对"缺失操作"的意思:
std::wstring foo("hello"); // requires the L() macro or something like that
std::string bar("hello");
std::wstring goose(bar.c_str());
foo="hello";  // requires the L() macro
foo=bar.c_str();
foo=bar;
编辑:我想以某种方式"集中".那是因为我有一个项目要从M $ -Windows移植,其中有数千个这些失败的操作.
好处是:有一个中心位置,其中定义了要使用的字符串类型,例如:
#ifdef WINDOWS_OS
    typedef std::wstring AppStringClass;
#else
    typedef std::string AppStringClass;
#endif
小智 15
这是合法的,但很多人认为这是不可取的.问题是标准库模板类没有虚拟析构函数.所以,如果您编写这样的代码:
std::wstring * p = new CustomWString ;
...
delete p;
你有未定义的行为.
pet*_*hen 10
编译器肯定会让你,因为没有办法用C++中的公共构造函数密封类.
STL容器不是为继承而设计的,因此通常是一个坏主意.C++必须忽略许多奇怪的角落.您的派生类可能会破坏另一个STL实现,或者只是更新构建环境.
但是,我认为这是一个严厉的警示标志,而不是完全禁止.这是"你真的很确定你在做什么,你知道所有的影响,并且对所有选择都有很好的论据"吗?
在您的情况下:提供额外的构造函数很好(因为公共接口已记录并且您可以复制它),并且只要您不引入新数据成员或VMT,切片或非虚拟析构函数不是问题.(请记住,虽然C++标准在通过没有虚拟DTor的基类指针进行删除时声明了未定义的行为)
但是,我不确定如何在char const * c_str()不为字符串提供存储的情况下实现.一旦你引入了新的数据成员,你就进入了一个地雷领域.  
| 归档时间: | 
 | 
| 查看次数: | 1289 次 | 
| 最近记录: |