Как дублировать функциональность CString - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть исходный файл MFC, который мне нужно скомпилировать в Qt. Этот файл использует MFC / ATL CString. В частности, он использует CString в качестве аргумента для iostream :: open (). Я написал класс CString, который наследуется от QString, так что я могу использовать большинство функций 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 ]

5 голосов
/ 07 сентября 2011

Согласно это , CString имеет перегруженный operator LPCTSTR, что работает без каких-либо явных преобразований.

Я предполагаю, что если вы хотите эмулировать это поведение, вам нужно будет предоставить аналогичную перегрузку.LPCTSTR несколько отсталый;так что operator const char *, вероятно, лучше.

2 голосов
/ 07 сентября 2011

Прежде всего, правильный дизайн для вашего 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;
};

Это, вероятно, решит проблему. Надеюсь, это поможет.

1 голос
/ 07 сентября 2011

Не пытайтесь вводить код 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 почти во всех отношениях.

1 голос
/ 07 сентября 2011

Определите оператор Typecast для вашего CString класса следующим образом:

operator const char*() { return this->toStdString().c_str(); }
1 голос
/ 07 сентября 2011

Я написал класс CString, который наследуется от QString, чтобы я мог использовать большинство функций QStrings

Не делай этого. QString не имеет деструктора virtual и не предназначен для наследования от. В этом отношении QString ничем не отличается от std::basic_string, который обозначен в этом другом ответе .

0 голосов
/ 07 сентября 2011

Вы должны попробовать простое:

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...