0

メインのオブジェクトで Add() 関数が使用された後、Print() 関数が正しく更新されないのはなぜですか?

int main()
{
   Rational myRational(3,5);
   myRational.Print(); //Displays 3/5 as expected
   myRational.Add(2);
   myRational.Print(); //Displays 3/5 instead of 13/5
   return 0;
}

//from Rational.cpp

//Overloaded constructors
Rational::Rational() :
    num(0),
    denom(1)
{
}
Rational::Rational(int n) :
    num(n),
    denom(1)
{
}

Rational::Rational(int n, int d) :
    num(n),
    denom(d)
{
}

Rational Rational::Add(const Rational& r1) const
{
    int numerat = num * r1.getDenominator() +
                 denom * r1.getNumerator();
    int denomin = denom * r1.getDenominator();

    return Rational(numerat, denomin);
} 

void Rational::Print()
{
    cout << num << "/" << denom <<endl;
}

コードをデバッグすると、Add 関数は値 13 と 5 を期待どおりに返し、正しいコンストラクターも同様に返します。残念ながら、Print() 関数は、新しい値ではなく元の分数を保持します。

4

2 に答える 2

3

methodRational Rational::Add(const Rational& r1) constは、署名が示唆するように、その実装方法は、呼び出されたオブジェクトを変更するのではなく、新しいRationalインスタンスを作成して返すためです。

試してみてください:

myRational.Print(); //Displays 3/5 as expected
myRational = myRational.Add(2);
myRational.Print(); //Displays 3/5 instead of 13/5

ヒント: 署名の最後にあるという事実はconst、メソッドが呼び出されたインスタンスを何も変更しないことを意味します。つまり、そのようなメソッドは、myRational呼び出したインスタンスを変更できないことを意味します。

于 2013-01-06T03:30:40.630 に答える
1

この機能:

Rational Rational::Add(const Rational& r1) const

結果を呼び出しスコープに返します。結果をどこにも保存していません。したがって、myRational元の値を取得しています。

値をオブジェクトに保存してから印刷してみてください。元のコンテンツも保持したい場合はmyRational、これを試してください:

int main()
{
       Rational myRational(3,5);
       myRational.Print(); //Displays 3/5 as expected
       Rational myRational2 = myRational.Add(2); //Result stored in new object
       myRational2.Print(); //Printed new object values
       return 0;
}
于 2013-01-06T03:30:20.143 に答える