2013-08-23 127 views
0

我遇到了一個奇怪的問題。當我嘗試編寫一個返回指向子類的指針的函數時,我爲該子類的另一個實例交換了一個「錯誤C2106:'=':左操作數必須是l值」的錯誤。C++返回指針值不可更改

裏邊反問題是在one->getMe() = two;行:

class subClass{}; 

class someClass{ 

public: 

subClass * pointer; 

someClass(){ 
    pointer = new subClass; 
} 

subClass * getMe(){ 
    return pointer; 
} 

}; 

int main(){ 

someClass * one = new someClass; 
subClass * two = new subClass; 

one->getMe() = two; 
} 

我有點新的C++這樣的問題可能是可怕的簡單。任何幫助深表感謝。

+0

你想修改什麼 - 指針的值或指針指向的對象的值? –

+0

名稱'getMe()'表明它可以_get_值,而不是_set_值 – sehe

+0

您正在返回一個右值。使用set方法設置新的指針。 – Banex

回答

1

one->getMe() = two; 

試圖指針在兩個分配給單> getMe()。但是one-> getMe()返回一個你不能分配的臨時副本。如果你想通過參考返回指針,從而能夠改變它,那麼你可以使用簽名

subClass *& getMe(); 

其他人已經建議。這就是說,你正在暴露一個類的內部工作,以便所有人和各種各樣的人查看和修改,特別是指向堆上的對象的指針,這些指針可能會或可能不會被正確地解除分配,這是不明智的。

+0

感謝您的快速響應,解決了問題。我正在真實項目的更安全的環境中使用它。 –

5

從函數返回的指針是對象中指針的副本。這是一個臨時性的,你不能分配給它。即使你可以分配給它,它也不會有好處,因爲它不再連接到對象中的指針。如果你希望能夠在從函數返回對象的指針後分配它,你希望通過引用返回指針。

subClass *& getMe() { 
    return pointer; 
} 

您還應該考慮添加一個const重載以處理const對象。這可能是這樣的:

subclass * const & getme() const { 
    return pointer; 
} 
+0

我建議在這裏const常數超載 – sehe

+0

神奇的解釋,謝謝。 –

+0

令人悲傷的是,考慮const正確性的唯一答案最終被投票次數最少。 +1 – sehe