C++中Rational类分数加法错误排查求助
排查Rational类加法功能的错误
嘿,我一眼就瞅出问题在哪了——你的addition函数不小心修改了调用它的对象本身的成员变量!
咱们来拆解一下:在你写的addition方法里,你直接对当前对象的numerator和denominator做了赋值操作:
numerator = numerator * a.denominator + a.numerator * denominator; denominator = denominator * a.denominator;
这就导致当你调用n2.addition(n3)的时候,n2本身的数值被直接改成了加法后的结果!所以后面你打印n2的时候,它已经不是原来的1/2了,变成了4/4,这才出现了输出里那种奇怪的4/4 + 1/2 = 4/4。
修复方法
加法操作应该是无副作用的——也就是只返回计算结果,不修改参与运算的任何对象本身。我们需要用临时变量来存储计算出来的新分子和分母,而不是直接覆盖当前对象的成员:
Rational Rational::addition(const Rational &a) { // 用临时变量存新的分子分母,完全不碰当前对象的成员 int new_num = numerator * a.denominator + a.numerator * denominator; int new_den = denominator * a.denominator; return Rational(new_num, new_den); }
修改之后,n2.addition(n3)只会算出n2 + n3的结果,n2本身还是原来的1/2。再运行你的main函数,输出就会变成正确的:
Testing addition: 1/2 + 1/2 = 4/4
额外优化建议(可选)
你还可以给Rational类加一个约分的逻辑,比如把4/4简化成1/1。可以写一个私有的辅助函数reduce(),在构造函数和运算函数最后调用它,用最大公约数(GCD)来约分分子分母,这样输出会更规范。
内容的提问来源于stack exchange,提问作者muzzi
相关产品推荐
相关产品推荐

