我想从Qt扩展QString类,为转换为各种字符串类型提供一些便利。
例如,我希望能够编写如下行:
MyStringClass myString(_T("Hello World!"));
并获取一个行为与QString类似的MyStringClass对象。只使用QString,就必须写成:
QString myString = QString::fromWCharArray(_T("Hello World!"));
我还想添加到MyStringClass中的其他功能,但是我已经挂断了构造函数如何重载以接受wchar_t参数,如我的示例所示。看来QString的内部数据是私有的,所以我的派生类不能直接根据需要设置对象(据我所知)。
答案 0 :(得分:1)
你真的没有抽象任何东西,这是一个坏主意。如果你咬紧牙关并立即修复它,你将永远不必再次处理它。如果你继续推迟,费用会随着你的增加而增加。
你真的想让你的基本类型尽可能简单。
有6种不同的字符串类型也是不可管理的,所以要尽快缩小到QString。如果您想要帮助转换类型,请编写一些适配器函数。为方便起见,我在QString和std :: string之间进行转换时使用了类似下面的简单内容。
std::string sstr(const QString &str);
QString qstr(const std::string &str);
我确信你可以为你提到的其他类型写相似的内容。
如果您真的想编写自己的课程以帮助完成转换,那么您应该保护自己免受其继续使用。真正的风险是,尽管它有意贬值,但它会被永久使用。如果你在公共接口中允许新的字符串类,那将很难摆脱。那时它只是另一个字符串类型来处理其他字符串。
class MyStringClass {
public:
MyStringClass(const std::string &val);
MyStringClass(const char *val);
MyStringClass(const wchar_t *val);
QString getQString() const;
};
这提供了一种在新代码中获得所需内容的简便方法,并且不允许隐式转换。无论如何,QString是一个值对象,不确定您是否可以按照自己的方式使用它。
你有可能不会转换大部分代码,但只要它在私有实现中它就不会经常伤害你。