我为operator-=为我的Rational-class定义了一个重载:
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);
任何想法为什么?
答案 0 :(得分:2)
您的-=
运营商应该更改numerator
和denominator
的值,但事实并非如此。添加代码以将这些值设置为this
,而不是创建result
:
Rational& Rational::operator-=(const Rational& subtracted) {
numerator = (*this).getNumerator()*subtracted.getDenominator() - (*this).getDenominator()*subtracted.getNumerator();
denominator = (*this).getDenominator()*subtracted.getDenominator();
return *this;
}
答案 1 :(得分:2)
您永远不会在您的运算符中指定“this” - =!
您的函数创建一个临时Rational对象(称为“结果”)。然后,它会忘记“结果”并返回它。
您需要实际分配给this-> numerator和this->分母。
答案 2 :(得分:1)
就是这样,因为你没有改变对象。
您必须更改对象成员变量,而不是创建临时对象。
Rational& Rational::operator-=(const Rational& subtracted) {
numerator = ...;
denominator = ...;
return *this;
}
你应该知道这个:
Rational result(...);
只创建本地对象。它与调用-=
的对象无关。