2012-12-19 109 views
1

因为我不是C(++)专家,所以我被编译器的一些固执难住,不想将QString转换为QString *。 我有一个函数:将QString转换为QString的指针

bool getNextMessage(int sId, QString *msg, QString *cmd) 

我使用的指针,在这里,因为我不能返回多个变量(被宠坏的Perl编码器;)在C),我想在一段时间(getNextMessage(使用这个.. 。)){...}样式循环。 内部的功能有一些SQL foo和这样的:

msg = QString(""); 
cmd = QString(""); 
return false; 

所有编译器从这个产生是这样的:

cannot convert 'QString' to 'QString*' in assignment 

难道你亲爱的乡亲们请拿起谜给我吗?谢谢。 :)

编辑: 解决方案:现在使用参考感谢来自leemes的指针。

回答

5

为此,您通常使用引用,不指针。对于C++新手来说,很难弄清楚区别。简短的解释是“引用是更安全的指针”。

bool getNextMessage(int sId, QString &msg, QString &cmd) 

这样一来,就可以调用该方法不前转换为指针,当你正常工作的变量具有相同的语法使用的引用,所以你的设置字符串的内容代码是好的。

如果你想坚持的指针 - 或者,了解如何使用指针做到这一点 - 这是你如何使用指针工作:

*msg = QString(""); 

*msg解引用msg,这意味着你正在使用对象后面的指针。对于函数调用,有->运算符。

调用

msg = new QString(""); 

将语法正确过,但不会做你希望它做什么!这一行意味着你分配一个新的QString对象并获得这个新创建的对象的指针。然后,您将此指针分配给msg。这适用于函数中的以下代码。但是,您自己更改了msg(指针地址),而不是msg指向的内存。这意味着,主叫方在这里不会注意到任何东西。调用者在函数调用后使用旧指针。

+0

谢谢,不知道引用,它现在的作品。 – BastetFurry

+0

函数的输出参数实际上是其中一种查看情况,我发现指针可以超过引用:在堆栈上创建QString foo,然后通过&foo传递 - &表示它是out参数。这种模式的一个例子是.e.g。 QString :: toInt(bool * ok),其中ok返回是否解析int成功。 –

+0

@FrankOsterfeld当参数是可选的时候,我同意你的意见,就像在'QString :: toInt'示例中一样。但是,如果它是强制性的,我们不能传递“空引用”。所以默认值是一个事后不用的实例......最后,这是一个口味问题,我想。 – leemes

0

好的一个QString不是QString*。也许你想取消引用指针,并分配给它指向的对象:

*msg = QString(""); 

或者我期待以下是等价的:

*msg = ""; 
4

请尝试使用以下内容。

*msg = QString(""); 
*cmd = QString(""); 

确保您的指针已初始化。

+0

你确定这种语法吗? – acraig5075

+0

@ acraig5075没关系。为什么它应该是错的? – leemes

+0

ctor不返回指针。 – acraig5075