2013-11-04 63 views
-1

所以我想寫這個類。我希望能夠做的事情之一是將兩個加在一起,所以我超載了加法運算符。但是這裏的東西,我不想返回一個指針,我想要「按值」返回類,以便添加操作符不會干擾指針。按值C++返回一個類?

我目前的方法不起作用,因爲我創建的類超出了範圍,而我能想到的唯一方法就是用指針來完成。有沒有其他的方式來做到這一點,而不需要調用new和分配內存,這些內存稍後必須由類的用戶刪除?

當前的代碼:

Polynomial operator+(const Polynomial &lhs, const Polynomial &rhs) 
{ 

    Polynomial newPoly; 
    newPoly.addWithOther(lhs); 
    newPoly.addWithOther(rhs); 
    return newPoly; 
} 
+1

這應該可以正常工作,但我會用'operator + ='來實現它。 – chris

+0

爲什麼不能'Polynominal newPoly(lhs); newPoly.operator + =(右);返回newPoly;'。另外,newPoly退出範圍應該不會成爲問題,因爲您正在返回它,這表明您的副本或分配構造函數存在問題。 – kfsone

+1

你應該問自己以下問題;如果您感到困惑,請將「Polynomial」類的定義(不一定是實現)添加到您的問題中。 「Polynomial」類是否有默認的構造函數,以便「Polynomial newPoly」語句正確?這可能由編譯器生成。 Polynomial類是否有複製構造函數,以便您的返回值可以複製到調用上下文中?再次,這可能由編譯器生成。另一個說明:寫它「不起作用」不是很有幫助。你看到什麼編譯器/運行時錯誤? – NicholasM

回答

-1

好吧,我想通了。複製構造函數在返回被調用後立即調用。並且返回寄存器將獲取您的對象的副本。在這裏,任何沒有返回的對象都將超出範圍。如果您不執行這些對象的深層副本,或者對我而言,這是一個「足夠深的」副本,則會由系統重新分配這些成員。

+0

「另外,newPoly退出範圍不應該是一個問題,因爲你正在返回它,這意味着你的複製或賦值構造函數有問題 - kfsone昨天」和「該對象超出範圍,但只有在被返回。這就是爲什麼你可以返回一個std :: string,也是爲什麼沒有人回答。谷歌「返回價值優化」 - kfsone昨天「 – kfsone

+0

酷的故事兄弟。 「懸掛」是一個很好的模糊和混淆的術語。一路溝通不暢。 –

+0

複製構造函數不被稱爲「返回被調用後」,它被稱爲*,因爲返回*。返回不是一個函數,它是一個聲明,「return localObject」是合法的,正是因爲它的作用。您可以通過爲代碼提供更多上下文來避免將問題錯誤地傳達出去 - 請看看第二條對於您的問題的評論,我會點頭指示,但缺乏足夠的上下文來將其轉化爲一個問題來解釋它在你的代碼方面。 – kfsone