2012-12-19 104 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