C++类内公有方法调用私有gcd方法输出空白问题
问题排查与修复
你尝试的几种gcd()调用语法本身没有错误,控制台输出空白是代码中3处逻辑错误导致的:
- 第一处:
gcd()方法返回值错误。辗转相除法的循环终止条件是absNum2 == 0,此时计算得到的最大公约数存储在absNum1中,原代码返回永远为0的absNum2,后续做约分除法时触发除以零的未定义行为,直接导致输出异常。 - 第二处:分数乘法逻辑写反。分数乘法规则是分子乘分子、分母乘分母,原代码写为当前对象分子乘第二个分数的分母、当前对象分母乘第二个分数的分子,计算逻辑完全颠倒。
- 第三处:const限定不匹配。原代码中
operator*被声明为const成员函数,仅能调用同为const修饰的类成员方法,而gcd()没有加const限定,在严格编译选项下会直接触发编译报错。
修复后的可运行代码
#include <iostream> #include <cstdlib> // 引入abs函数依赖的标准头文件,避免跨编译器编译报错 using namespace std; class Fraction { friend ostream & operator<<(ostream & os, const Fraction& fraction) { os << " " << fraction.numerator << "\n" << "---" << "\n" << " " << fraction.denominator; return os; } friend istream & operator>>(istream &, Fraction); private: int numerator; int denominator; // 为gcd添加const限定,修正返回值 int gcd(int num1, int num2) const { int absNum1 = abs(num1); int absNum2 = abs(num2); while (absNum2 != 0) { int remainder = absNum1 % absNum2; absNum1 = absNum2; absNum2 = remainder; } return absNum1; }; public: Fraction(int n, int d) { this->denominator = d; this->numerator = n; } Fraction(int n) { this->numerator = n; this->denominator = 1; } Fraction() { this->numerator = 1; this->denominator = 1; } Fraction operator*(const Fraction& fraction2) const { Fraction multipliedFraction; // 修正分数乘法计算逻辑 multipliedFraction.numerator = this->numerator * fraction2.numerator; multipliedFraction.denominator = this->denominator * fraction2.denominator; int fractionGCD = this->gcd(multipliedFraction.numerator, multipliedFraction.denominator); multipliedFraction.numerator /= fractionGCD; multipliedFraction.denominator /= fractionGCD; return multipliedFraction; } }; int main() { Fraction fraction1 = Fraction(1, 2); Fraction fraction2 = Fraction(1, 2); fraction2 = fraction1 * fraction2; cout << fraction2; return 0; }
运行结果
代码运行后会正确输出1/2乘1/2的约分结果:
1 --- 4
内容的提问来源于stack exchange,提问作者sinafarheidar12
相关产品推荐
相关产品推荐

