2015-02-06 50 views
0

我在寫一個bignum實現,並在其中重載了運算符+和=。這裏是我的代碼,做它:Overloading =在bignum實現中

BigNum& operator+(const BigNum& b) { 
    BigNum sum; 
    int carry=0; 
    for (int i=0; i<N;i++){ 
     sum.dig[i]=(dig[i]+b.dig[i]+carry)%10; 
     carry=(dig[i]+b.dig[i]+carry)/10; 
    } 
    return sum; 
} 

BigNum& operator=(const BigNum& rhs) { 
    for (int i=0; i<N; i++){ 
     dig[i]=rhs.dig[i]; 
    } 
    return *this; 
} 

他們似乎都對自己的運作良好(我可以正確地分配BIGNUM到BIGNUM正確添加兩個大數),但是當我試圖將它們結合起來,我得到似乎是隨機的答案。因此,如果A和B都是大數,沒關係,如果我說

BigNum c=b; 

cout<<a+b; 

a=a+b; 

給出了一個意想不到的結果。

+0

什麼是'dig'?它是如何定義的?你能給我們一些具體的例子輸入和輸出嗎? – 2015-02-06 03:24:34

回答

1

您正在從+運算符返回對本地變量sum的引用。你不能有意義地返回引用或指向局部變量的指針。由於這個錯誤,你的代碼的行爲是不確定的,這是你「意想不到的結果」的原因。

既然要實現一個標準二進制+,您必須通過價值

BigNum operator +(const BigNum& b) const { 
    BigNum sum; 
    ... 
    return sum; 
} 

返回結果作爲附加的註釋,二進制+更有意義,作爲一個獨立的(可能是朋友)功能,不作爲班級成員。如果你想保持它作爲一個班級成員,至少要宣佈它const(見上文)。

另一個問題是什麼是什麼N是什麼以及您的班級是否違反了三條規則。但是從你發佈的內容來說是不可能的。

+0

我不明白這與我的代碼有什麼不同,除了聲明爲const,它不能解決問題。你能詳細說明一下嗎? – user132290 2015-02-06 03:30:00

+1

@ user132290:返回類型是'BigNum',而不是你的'BigNum&'。如果你想用C++編程,你必須學會​​看到這樣的小東西。 – AnT 2015-02-06 03:30:53

+0

確實很好。可悲的是編譯器應該在沒有我們需要查看的情況下發現這個問題。可能OP沒有完全啓用警告和錯誤。他/她應該儘快做到這一點。 – 2015-02-06 07:22:09

0

這可能不會回答你的問題,但我相信它會改善你的代碼,因此這是一個「建議」。

實施+運算符來創建調用+ =運算符的臨時數據是明智的。

例如:

BigNum& operator += (const BigNum &other) { 
    int carry = 0; 
    for (int i = 0; i < digits_length; ++i) { 
     int temp = digit[i]; 
     digit[i] = (digit[i] + other.digit[i] + carry) % 10; 
     carry = (temp + other.digit[i] + carry)/10; 
    } 
    return *this; 
} 

BigNum operator + (const BigNum& other) const { 
    return BigNum(*this) += other; 
}