2015-11-10 111 views
0

我無法弄清楚爲什麼我的BigInt實例和自定義矢量類(BigIntVector)一起從+ =轉換成+函數時發生了變化。看看我在main.cpp中的例子,我們有40 +(-30),它在我的BigInt.cpp代碼中意味着它將把它變成40-30(然後在末尾打印負號,因爲'isPositive'bool是假的)。使用調試器,我確實知道 - =將正確的值10返回到+ =。因此,在+ ='tempThis'中包含10個向量並返回到+函數。但是當它返回到+函數時,那個範圍內的'tempThis'變成了40?任何理由?從函數返回錯誤的實例

謝謝。

BigInt.cpp此外

// binary addition 
BigInt BigInt::operator+(BigInt const& other) const { 

    BigInt tempThis = BigInt(*this); 
    tempThis += other; //tempThis becomes 40 which isn't 10 for 40-30!!!!!!! 
    return tempThis; 
} 

// compound addition-assignment operator 
BigInt BigInt::operator+=(BigInt const& other) { 

    if (!other.isPositive) { 
     BigInt tempThis = BigInt(*this); 
     tempThis -= other; //tempThis is correctly assigned 10 for 40-30!!!!!!!! 
     cout << "get element at 0 +=: " << tempThis.bigIntVector->getElementAt(0) << endl; 
     return tempThis; 
    } 

的main.cpp

BigInt num11 = -30; 

cout << "num11 (-30): " << num11 << endl; 

BigInt num12 = 40; 

cout << "num12 (40): " << num12 << endl; 

BigInt num13 = num12 + num11; 

cout << "num13 (-10): " << num13 << endl; 

打印:

num11(-30):-30

num12(40):40

num13(-10): 40

回答

2

您的化合物加成賦值運算符+=應該是:

  1. 修改自己的值;和
  2. 返回對其自身的引用,而不是其值的副本。

簽名應該是:

BigInt& BigInt::operator+=(BigInt const& other) 

在這,你不想使用臨時值,或者可能是,如果你遇到的問題可能發生,希望保證行爲失效的條件下,使用臨時變量,如果成功則覆蓋你的'this'對象。

看看這個網頁:http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html 瞭解更多信息。如果您不想閱讀整個內容,請在頁面中搜索「Compound Assignment Operators」。

+0

這就是它!謝謝! – sanic

2

您缺少賦值運算符重載,你需要引用返回爲bigint即

BigInt& BigInt::operator+(BigInt const& other) const 
+0

我很笨。不幸的是,打印40,而不是30,仍然不會更新後。 40-30應該是10,你是正確的,但isPositive布爾當它是假時在前面打印一個負數。無論哪種方式,我正在尋找10不是40 – sanic

+1

我們都在那裏。我昨天花了一個小時,試圖弄清楚爲什麼有些東西掛着,然後發現我前一天添加的睡眠(20000) – slipperyseal

+0

不幸的是,這隻會讓事情更進一步。任何正常的添加(沒有進入如果聲明爲否定的「其他」)工作得很好,並返回正確的值。我懷疑問題在於某個地方,如果聲明,我認爲我回來了錯誤的事情。除此之外,如果聲明我只是返回'*此' – sanic