如何复制CString功能

How to duplicate CString functionality

本文关键字:CString 功能 复制 何复制      更新时间:2023-10-16

我有一个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具有QStringoperator const char *的大部分功能。

如果您仍然想围绕QString编写一个新的包装器类,那么多亏了该运算符,您可以使用QString::toAscii()而不是更长的QString::toStdString()::c_str()