我試圖超載分區運算符/
對於Polynomial
類,但算法本身是無關緊要的。問題是,當我嘗試返回它出於某種未知的原因時,C++似乎正在破壞我的多項式。C++:如何避免從方法返回後矢量被破壞?
這是類的相關部分:
class Polynomial
{
public:
.........
Polynomial &operator/(const double &) const;
private:
int DEGREE;
std::vector<double> poly_terms; // stores the polynomial coefficients
.........
}
而且這是我不能正常工作的方法:
Polynomial &Polynomial::operator/(const double &rhs) const
{
Polynomial result(10); //create new polynomial object with a maximum degree of 10
double buffer;
for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms is of type vector<double>
result.setCoeff(i, buffer/rhs); //this method assigns (buffer/rhs) to the i-th index of result's vector data-member.
}
return result; //return Polynomial instance
}
執行return
子句前右,一個調試器顯示result
對象的所有數據成員的值都正確設置,因爲算法應該設置它們,包括vector
數據成員。所以在return
返回之前,result
是100%正確構建的,因此該方法的邏輯看起來很好。
但是在執行return
語句之後,所有內容都不能正常運行。由於某種原因,返回的對象將其vector
數據成員更改爲空vector
(奇怪的是,其他所有不是對象的數據成員(如DEGREE
)仍然保持原樣)。我不確定它是否是以某種方式清空的相同矢量對象,或者如果它是包含此矢量對象的多項式對象的失敗副本。
有誰知道爲什麼會發生這種情況,我該如何避免它?
UPDATE1: 我要指出,我也嘗試用new
創造此法的Polynomial
對象。而且我也嘗試不通過刪除&
來返回參考,所以有一個像Polynomial Polynomial::operator/(const double &rhs) const
這樣的標題。但是這兩個都對vector
數據成員產生了類似的不良影響。
UPDATE2: 看來我能夠追查到這個問題,這要歸功於那些提到我不應該返回引用的人。問題在於,需要重載複製構造函數並重載賦值運算符以手動執行向量數據成員的副本(不確定是否需要這兩個副本),我只是實現了所有3個這些東西,現在它完美地工作) 。感謝大家幫助解決這個問題。
不要返回被實例化多項式參照。請參閱:http://stackoverflow.com/questions/4421706/operator-overloading – NathanOliver
您已經在堆棧中創建了'result',而您需要使用'new'在堆上創建它。 –
這是未定義的行爲,您將返回臨時引用。只是回報價值和解決問題。 – 101010