2010-05-02 110 views
0

我試圖重載+ =運算符爲我的有理數類,但我不認爲它的工作,因爲我總是以相同的結果結束了:+ =重載在C++的問題

RationalNumber RationalNumber::operator+=(const RationalNumber &rhs){ 

    int den = denominator * rhs.denominator; 

    int a = numerator * rhs.denominator; 
    int b = rhs.numerator * denominator; 
    int num = a+b; 

    RationalNumber ratNum(num, den); 
    return ratNum; 
} 

內主

//create two rational numbers 
RationalNumber a(1, 3); 
a.print(); 

RationalNumber b(6, 7); 
b.print(); 

//test += operator 
a+=(b); 
a.print(); 

在調用+ =(b)後,a仍然是1/3,應該是25/21。任何想法我做錯了什麼?

+0

你有沒有試過在調試器中運行這個?你的功能是否已經進入? – 2010-05-02 16:48:54

+0

你的實現將更適合operator +,儘管這最好是用operator + =來實現。 – starblue 2010-05-02 16:52:09

回答

7

operator+=應該修改對象本身並返回一個引用。而是創建一個新對象並返回它。這樣的事情可能工作(未經測試的代碼):

RationalNumber &RationalNumber::operator+=(const RationalNumber &rhs){ 

    int den = denominator * rhs.denominator; 

    int a = numerator * rhs.denominator; 
    int b = rhs.numerator * denominator; 
    int num = a+b; 

    numerator = num; 
    denominator = den; 
    return *this; 
} 

同樣operator+應該返回一個新的對象,並且幾乎可以隨時的術語來實現的operator+=

RationalNumber RationalNumber::operator+(const RationalNumber &rhs){ 
    RationalNumber tmp(*this); 
    tmp += rhs; 
    return tmp; 
} 

最後,(現在我就在關閉主題),通常認爲使用免費函數而不是成員的最佳做法是,您可以使用二元運算符。

+0

@starblue:感謝編輯,很好的接收:-)。 – 2010-05-02 16:52:40

+0

謝謝....它以這種方式工作 – user69514 2010-05-02 17:04:35

1

您沒有更改操作員應用的對象。

x += 3; 

應該改變x。