2

我的代码支持原生 C++ 类型和 Qt 类型。例如,有string's 和QString's 是“等价的”。

我有 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它何时返回的值,它将是“hello world!” 正如预期的那样。

只是想让它LoadQString()正常工作。

感谢你的帮助!

4

3 回答 3

3

您应该从std::stringback 转换为QStringafterstd::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;
}
于 2012-02-27T19:42:47.827 回答
0

你应该调用LoadString, not LoadXMLAttribute,然后在你调用它之后分配ret给它,然后返回返回的那个。toReturnintLoadString

于 2012-02-27T19:42:20.213 回答
0

首先, toStdString 创建一个 std::string 对象作为临时对象。所以很自然地你不能从中获得引用,你必须将结果存储在一个值中,或者通过一个 const 引用来延长它的生命周期。

但是,对于您正在做的事情,假设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;
}

IftoReturn严格来说不是一个输出参数,也是一个输入参数(我建议您避免这样做,因为它是一种相当混乱的设计实践):

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) 转换回分配给输出参数 (toReturn) 的 QString。

于 2012-02-27T19:48:58.583 回答