Передача QString по ссылке - PullRequest
       9

Передача QString по ссылке

2 голосов
/ 27 февраля 2012

У меня есть код, который поддерживает как собственные типы C ++, так и типы Qt.Например, есть string и QString, которые являются «эквивалентными».

У меня есть 2 функции, одна из которых принимает string, а другая - QString.Версия QString преобразует параметры в string и затем вызывает версию функции string.

Вот некоторый общий код проблемы:

int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
    string tag = tagName.toStdString();
    string ret = toReturn.toStdString();
    //string& ret = toReturn.toStdString();    //This gives me an error

    return LoadString(tag, ret);
}

int myClass::LoadString(const string& tagName, string& toReturn)
{
    toReturn = "hello world!";

    ...
}

Итак, этот код будет скомпилирован и запущен ... однако, когда я вызываю LoadQString(), второй параметр - пустой QString, как только он возвращается.Вы можете видеть в моей закомментированной строке, где я пытался string& ret = ... получить ссылку на работу.Если я позвоню LoadString() и затем проверю значение toReturn, когда оно вернется, это будет "Привет, мир!"как и ожидалось.

Просто пытаюсь заставить LoadQString() работать правильно.

Спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Вы должны конвертировать из std::string обратно в QString после std::string версии вызова

int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
    string tag = tagName.toStdString();
    string ret = toReturn.toStdString();
    int retCode = LoadString(tag, ret);
    toReturn = QString::fromStdString(ret);
    return retCode;
}
0 голосов
/ 27 февраля 2012

Прежде всего, toStdString создает объект std :: string как временный.Поэтому, естественно, вы не можете извлечь из него ссылку, вы должны сохранить результат в значении или продлить его время жизни с помощью константной ссылки.

Однако, для того, что вы делаете, предполагая, что toReturn является строго выводомпараметр и что LoadString выполняет фактическую работу:

int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
    string tag = tagName.toStdString();
    string ret;
    int result = LoadXMLAttribute(tag, ret);
    toReturn = QString::fromStdString(ret);
    return result;
}

Если toReturn является не только выходным параметром, но и входным (я рекомендую избегать этого, так как это довольно запутанная практика проектирования):

int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
    string tag = tagName.toStdString();
    string ret = toReturn.toStdString();
    int result = LoadXMLAttribute(tag, ret);
    toReturn = QString::fromStdString(ret);
    return result;
}

Довольно просто.Преобразовать из QString в std :: string, вызвать вашу функцию, которая принимает std :: strings, сохранить возвращаемое значение и преобразовать выходной параметр (ret) обратно в QString, назначенную вашему выходному параметру (toReturn).

0 голосов
/ 27 февраля 2012

Вы должны позвонить LoadString, а не LoadXMLAttribute, а затем назначить ret на toReturn после того, как вы его вызвали, а затем вернуть int, который LoadString вернул.

...