Почему функция Print () не обновляется должным образом после того, как функция Add () используется объектом в main?
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 () сохраняет исходную дробь вместо новых значений.
Потому что метод Rational 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
на котором ты это называешь.
Эта функция:
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;
}