Все перегруженные конструкторы отображаются вместо целевого конструктора

Почему функция 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 () сохраняет исходную дробь вместо новых значений.

0

Решение

Потому что метод 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 на котором ты это называешь.

3

Другие решения

Эта функция:

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;
}
1