1

Rationalクラスの演算子-=のオーバーロードを定義しました。

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

オペレーターはと-=の値を変更する必要がありますが、変更しません。を作成する代わりに、これらの値をに設定するコードを追加します。numeratordenominatorthisresult

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

演算子で「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 に答える