我有一个MFC源文件,我需要在Qt下编译。此文件使用MFC / ATL CString。具体来说,它使用CString作为iostream :: open()的参数。我编写了一个继承自QString的CString类,以便我可以使用大多数QStrings的功能。
我主要担心的是我无法让我的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());
但是,这不是一种选择。未授权修改原始代码。 :(
有没有办法做到这一点,或者我将不得不使用Microsoft在cstringt.h中使用的相同,更复杂和冗长的代码来重建类?
由于
答案 0 :(得分:5)
根据this,CString
有一个超载的operator LPCTSTR
,这是如何工作的,没有任何明确的转换。
我的猜测是,如果你想模仿这种行为,你需要提供类似的重载。 LPCTSTR
有点迟钝;所以operator const char *
可能更好。
答案 1 :(得分:2)
首先,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;
};
这可能会解决问题。 希望这会有所帮助。
答案 2 :(得分:1)
我编写了一个继承自QString的CString类,以便我可以使用大部分QStrings的功能
不要这样做。 QString
没有virtual
析构函数,并且不打算从中继承。在这方面,QString
与this other answer中概述的std::basic_string
没有区别。
答案 3 :(得分:1)
为CString
类定义类型转换运算符,如下所示:
operator const char*() { return this->toStdString().c_str(); }
答案 4 :(得分:1)
不要试图将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依赖于Windows,因此在Qt中使用它会消除跨平台代码的优势,并且没有多大意义,因为我认为Qt框架在几乎所有方面都优于MFC。
答案 5 :(得分:0)
你应该尝试一下:
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()
。