+ = Проблема перегрузки в C ++ - PullRequest
0 голосов
/ 02 мая 2010

Я пытаюсь перегрузить оператор + = для моего класса рациональных чисел, но я не верю, что он работает, потому что я всегда получаю один и тот же результат:

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();

После вызова a + = (b) a все еще 1/3, оно должно быть 25/21. Есть идеи, что я делаю не так?

Ответы [ 2 ]

7 голосов
/ 02 мая 2010

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;
}

Наконец, (теперь я не в теме), обычно считается лучшей практикой использовать свободные функции вместо членов, где это возможно, для таких вещей, как бинарные операторы.

1 голос
/ 02 мая 2010

Вы не меняете объект, к которому применяется оператор.

x += 3;

должен изменить х.

...