1

我为我的 Rational 类定义了 operator -= 的重载:

rational.hh:
class Rational {

public:
    Rational(int numerator, int denominator) : numerator(numerator), denominator(denominator)
    { }

    int getNumerator() const;
    int getDenominator() const;
    Rational& operator-=(const Rational& bar);

private:
    int numerator, denominator;

rational.cc:
Rational& Rational::operator-=(const Rational& subtracted) {
    Rational result((*this).getNumerator()*subtracted.getDenominator() - (*this).getDenominator()*subtracted.getNumerator(), (*this).getDenominator()*subtracted.getDenominator());
    return *this;
}

代码编译时没有警告,但这段代码不会改变 r 的值:

  Rational r(1, 1);
  r -= Rational(1, 2);

任何想法为什么?

4

3 回答 3

2

您的-=操作员应该更改 and 的值numeratordenominator但事实并非如此。添加代码以将这些值设置为this,而不是创建result

Rational& Rational::operator-=(const Rational& subtracted) {
    numerator = (*this).getNumerator()*subtracted.getDenominator() - (*this).getDenominator()*subtracted.getNumerator();
    denominator = (*this).getDenominator()*subtracted.getDenominator();
    return *this;
}
于 2012-10-01T00:52:14.807 回答
2

你永远不会在你的 operator-= 中分配给“this”!

您的函数创建一个临时的 Rational 对象(称为“结果”)。然后,它忘记了“结果”并返回它。

您需要实际分配给 this->numerator 和 this->denominator。

于 2012-10-01T00:54:47.800 回答
1

之所以如此,是因为你没有改变对象。

您必须更改对象成员变量而不是创建临时对象。

Rational& Rational::operator-=(const Rational& subtracted) {
    numerator = ...;
    denominator = ...;
    return *this;
}

你应该知道这一点:

Rational result(...);

只是创建本地对象。它与调用的对象无关-=

于 2012-10-01T00:53:57.430 回答