You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.09 16:15:42