如何复制CString功能
How to duplicate CString functionality
我有一个MFC源文件,需要在Qt下编译。此文件使用MFC/ATL CString。具体来说,它使用CString作为iostream::open((的参数。我已经编写了一个从QString继承的CString类,这样我就可以使用QString的大部分功能。
我主要担心的是,我无法让我的CString实现在iostream::open((被调用的地方工作:
以下是我的一些类声明:
class CString : public QString {
public:
CString() : QString() {}
CString(const QString& other) : QString(other) {}
CString(const CString& other) : QString(other) {}
CString(_In_opt_z_ const XCHAR* pszSrc) : QString( pszSrc ) { *this = pszSrc; }
CString(const char* pszSrc) : QString( pszSrc ) {}
...
}
下面是使用CString:的部分代码
ofstream outfile;
CString Path("dump.txt");
outfile.open(Path);
错误为:
调用"std::basic_ofstream>::open(CString&("时没有匹配的函数
在"正常"情况下,我会简单地做一些事情,比如:
outfile.open(Path.toStdString().c_str());
然而,这不是一种选择。未授权修改原始代码(
有没有办法做到这一点,或者我必须使用微软在cstringt.h中使用的相同的、更复杂、更冗长的代码来重建类?
感谢
根据这一点,CString
有一个重载的operator LPCTSTR
,这就是在没有任何显式转换的情况下工作的方式。
我的猜测是,如果你想模仿这种行为,你需要提供类似的过载。CCD_ 3有点迟钝;所以CCD_ 4可能更好。
首先,CString
的正确设计是包装QString
,而不是从中继承。毕竟,您只是在重新连接方法调用。
class CString {
public:
/* ... */
private:
QString internal;
};
编译器抱怨ofstream::open()
方法没有定义为接受CString
参数。这意味着CString
不是直接获取的(毕竟,ofstream
是一个标准类(。您可以在类中编写一个强制转换,以便在需要时将其转换为char*。
class CString {
public:
/*...*/
operator const char *()
{
return internal.c_str();
}
private:
QString internal;
};
这可能会解决问题。希望这能有所帮助。
为CString
类定义一个typecast运算符,如下所示:
operator const char*() { return this->toStdString().c_str(); }
我已经编写了一个从QString继承的CString类,这样我就可以使用QString的大部分功能
不要这样做。QString
没有virtual
析构函数,也不打算从继承。在这方面,QString
与在该另一答案中概述的std::basic_string
没有什么不同。
不要试图将MFC代码硬塞进Qt环境中。也永远不要从没有虚拟析构函数的对象继承。包括QString
和大部分STL,如std::string
std::ofstream
是标准C++的一部分,期望C样式字符串const char*
直接用QString
做这样的事情:
ofstream outfile;
QString path("dump.txt");
outfile.open(path.toStdString().c_str());
或者直接使用std::string
:
ofstream outfile;
std::string path("dump.txt");
outfile.open(path.c_str());
MFC依赖于窗口,因此在Qt中使用它消除了跨平台代码的优势,在其他方面没有多大意义,因为在我看来,Qt框架几乎在各个方面都优于MFC。
您应该尝试一个简单的:
typedef QByteArray CString;
// And your code should work as expected
ofstream outfile;
CString Path("dump.txt");
outfile.open(Path);
QByteArray
具有QString
和operator const char *
的大部分功能。
如果您仍然想围绕QString
编写一个新的包装器类,那么多亏了该运算符,您可以使用QString::toAscii()
而不是更长的QString::toStdString()::c_str()
。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 在C++中使用Cstring反转字符串
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 当功能返回CSTRING时会发生什么
- 如何复制CString功能