如何复制CString功能

时间:2011-09-06 20:51:17

标签: c++ qt mfc

我有一个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中使用的相同,更复杂和冗长的代码来重建类?

由于

6 个答案:

答案 0 :(得分:5)

根据thisCString有一个超载的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析构函数,并且不打算从中继承。在这方面,QStringthis 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()