2017-01-18 107 views
1

我正在處理存儲在LinkedList中的多項式的C++項目。我想超載重要的操作符,如+, - ,*,/。 當函數返回結果時,我遇到了析構函數的一些問題。爲什麼重載的操作員不工作?

Polynomial& Polynomial::operator+(const Polynomial &p){ 
    Polynomial sum = *this; 

    if (p.list.isEmpty()) 
     return *this; 

    ListElement *temp = p.list.first; 

    while (temp){ 
     sum.list.addSorted(temp->data); 
     temp = temp->next; 
    } 

    return sum; 
} 

此功能非常好,但return sum;調用析構函數和我丟失數據。 Polynomial類的析構函數調用list.purge();,它釋放鏈表中的動態內存。所有的類和方法都很好。

在主我得到:

Polynomial p1,p2,sum; 
p1.input();    //here I input data for first pol 
p2.input(); 

sum=p1+p2;    //I overloaded operator=, it works fine 

我必須做的 「停止」 析構函數?我想在屏幕上輸出Polynomial sum。謝謝!

+8

不要通過引用返回局部變量。 – AlexD

+3

'Polynomial&Polynomial :: ...' - >'Polynomial Polynomial :: ...' – jaggedSpire

+3

對於'operator +'來說,它可能不是一個好主意,它會破壞其操作的原始值。爲了避免這樣做,將此方法聲明爲'const'。 – tadman

回答

0

最好是這樣超負荷運營商+

Polynomial operator+(const Polynomial& p1, const Polynomial &p2){ 
    if (p1.list.isEmpty()) 
     return p2; 
    else if (p2.list.isEmpty()) 
     return p1; 

    Polynomial sum = p1; 
    ListElement *temp = p2.list.first; 
    while (temp){ 
     sum.list.addSorted(temp->data); 
     temp = temp->next; 
    } 

    return sum; 
} 

讓它有兩個參數,並使其friendPolynomial

2.退貨object而不是reference

0

你不應該返回一個局部變量的引用!

Polynomial sum = *this; 

... 

return sum; 

從返回類型中刪除&sum住在堆棧上(又名自動存儲)。當其包含範圍退出時,它將被銷燬 - 該實例的析構函數被調用。你不應該返回一個引用;這就像返回一個參考鬼。

如果您按價值返回,則會返回一筆金額的副本,您將無誤。

+1

中的「規範實現」是的,但如果OP沒有遵守三規則,他們仍然是一條小溪。你不想知道槳的位置。 – user4581301

+0

你是對的,他應該學習它並遵守它。 –

+0

你是對的,他應該學習它並遵守它。 –

0

不要返回對本地變量的引用。在一個函數範圍內創建的對象,在該範圍內生存並死亡。

但是,您可以創建引用對象的變量,並且該變量的生命週期現在與其引用的對象的生存時間相同。

像這樣:

Polynomial& Polynomial::operator+(const Polynomial &p){ 
    Polynomial &sum = *this; 

    if (p.list.isEmpty()) 
     return sum; 

    ListElement *temp = p.list.first; 

    while (temp){ 
     sum.list.addSorted(temp->data); 
     temp = temp->next; 
    } 

    return sum; 
} 
+0

'sum'現在不是NULL,它很棒,但是我失去了p1的數據。我的意思是: _p1 = 5X^2 p2 = X^2_ 運算符函數之後 _sum = 6X^2_ ** p1 = 6X^2 **而不是5X^2 p2 = X^2 如何處理這個? –