【发布时间】:2013-01-06 03:26:45
【问题描述】:
为什么在 main 中的对象使用 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() 函数保留了原始分数而不是新值。
【问题讨论】:
-
现在您已经阅读了答案并意识到您被 (1) 错误命名(纯函数的命令式“命令”名称)和 (2) 误导糟糕的调用模式设计(成员函数而不是独立的
operator+)。实际解决方案:定义一个名为operator+的独立函数。使其成为Rational的friend,或者让它使用修改成员函数operator+=。一般来说,将纯函数命名为函数结果的描述是个好主意。例如sum,如果您不想使用operator+。
标签: c++ oop reference constructor constructor-overloading