QString按引用问题传递

时间:2012-02-27 19:37:01

标签: c++ string qt parameter-passing qstring

我的代码既支持本机C ++类型,也支持Qt类型。例如,stringQString是“等价的”。

我有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()正常工作。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

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;
}

答案 1 :(得分:0)

您应该致电LoadString,而不是LoadXMLAttribute,然后在调用ret之后将toReturn分配给int,然后返回LoadString { {1}}已退回。

答案 2 :(得分: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;
}

如果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)。