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

Fraction类默认构造器及重载构造器编译错误求助

分数ADT类编译错误修复方案

当前实现分数ADT类时遇到两个编译错误:

  • C2512 'Fraction': 无合适默认构造器可用
  • C2665 'Fraction::Fraction': 无重载函数可转换所有参数类型

尝试添加默认构造器后出现更多错误,以下是相关代码及修复方案:

教师提供的驱动程序

// driver for cmpsc122 Lab 4
#include "Frac.h"
#include <iostream>
using namespace std;
int main() {
    Fraction x(-3, 8), y(-15, -20), z, w(5);
    x.printFraction();  cout << " + ";  y.printFraction();
    z = x.add(y);
    cout << " = ";  z.printFraction();  cout << endl;
    z.printFraction();
    cout << " = ";  z.printFractionAsFloat();  cout << endl << endl;
    x.printFraction();  cout << " - ";  y.printFraction();
    z = x.subtract(y);
    cout << " = ";  z.printFraction();  cout << endl;
    z.printFraction();
    cout << " = ";  z.printFractionAsFloat();  cout << endl << endl;
    x.printFraction();  cout << " * ";  y.printFraction();
    z = x.multiply(y);
    cout << " = ";  z.printFraction();  cout << endl;
    z.printFraction();
    cout << " = ";  z.printFractionAsFloat();  cout << endl << endl;
    x.printFraction();  cout << " / ";  y.printFraction();
    z = x.divide(y);
    cout << " = ";  z.printFraction();  cout << endl;
    z.printFraction();
    cout << " = ";  z.printFractionAsFloat();  cout << endl;

#ifdef _WIN32 // _WIN32 is used by Visual C++
#if (_MSC_VER <= 1916) // check if it Visual Studio 2017 or earlier
system("pause");
#endif
#endif
    return 0;
}
/*
Sample run:
-3/8 + 3/4 = 3/8
3/8 = 0.375
-3/8 - 3/4 = -9/8
-9/8 = -1.125
-3/8 * 3/4 = -9/32
-9/32 = -0.28125
-3/8 / 3/4 = -1/2
-1/2 = -0.5
Press any key to continue . . .
*/

自行编写的Frac.cpp

#include "Frac.h"
#include <iostream>
#include <iomanip>

using namespace std;

Fraction Fraction::add(Fraction myFrac)
{
    int newNum;
    int newDom;
    newNum = myFrac.num + num;
    newDom = myFrac.dom + dom;

    Fraction i(newNum, newDom);

    return i;
}

Fraction Fraction::subtract(Fraction myFrac)
{
    int newNum;
    int newDom;
    newNum = num - myFrac.num;
    newDom = dom - myFrac.dom;

    Fraction i(newNum, newDom);

    return i;
}

Fraction Fraction::multiply(Fraction myFrac)
{
    int newNum;
    int newDom;
    newNum = num * myFrac.num;
    newDom = dom * myFrac.dom;

    Fraction i(newNum, newDom);

    return i;
    }

Fraction Fraction::divide(Fraction myFrac)
{
    int newNum;
    int newDom;
    newNum = num / myFrac.num;
    newDom = dom / myFrac.dom;

    Fraction i(newNum, newDom);

    return i;
}

void Fraction :: printFraction()
{
    cout << num << "/" << dom;
}

void Fraction::printFractionAsFloat()
{
    float i = float(num) / float(dom);

    cout << fixed << setprecision(3);

    cout << i;
}

自行编写的Frac.h

#ifndef FRAC_H
#define FRAC_H
class Fraction
{
public:
    Fraction(int myNum, int myDom);

    Fraction add(Fraction myFrac);

    Fraction subtract(Fraction myFrac);

    Fraction multiply(Fraction myFrac);

    Fraction divide(Fraction myFrac);

    void printFraction();

    void printFractionAsFloat();

private:
    int num;
    int dom;

};

#endif

错误原因分析

  1. C2512错误:驱动代码中Fraction z;需要调用无参默认构造器,但当前类仅定义了双参数构造器,编译器不会自动生成默认构造器。
  2. C2665错误:驱动代码中Fraction w(5);需要单参数构造器(表示分母为1的分数),但当前类无此重载版本。
  3. 额外问题:当前算术运算逻辑错误(如加法直接分子分母相加),无法得到示例中的正确结果,且未处理分数约分和符号统一。

修复方案

修正后的Frac.h

#ifndef FRAC_H
#define FRAC_H
class Fraction
{
public:
    // 默认构造器:初始化为0/1
    Fraction();
    // 单参数构造器:分子为传入值,分母默认1
    Fraction(int num);
    // 双参数构造器:自定义分子分母
    Fraction(int num, int dom);

    Fraction add(Fraction myFrac);
    Fraction subtract(Fraction myFrac);
    Fraction multiply(Fraction myFrac);
    Fraction divide(Fraction myFrac);

    void printFraction();
    void printFractionAsFloat();

private:
    int num; // 分子
    int dom; // 分母
    // 辅助函数:约分分数并统一符号到分子
    void reduce();
    // 辅助函数:计算最大公约数
    int gcd(int a, int b);
};
#endif

修正后的Frac.cpp

#include "Frac.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

// 默认构造器实现
Fraction::Fraction() : num(0), dom(1) {}

// 单参数构造器实现
Fraction::Fraction(int numerator) : num(numerator), dom(1) {}

// 双参数构造器实现,处理分母为0的情况并初始化约分
Fraction::Fraction(int numerator, int denominator) {
    if (denominator == 0) {
        cerr << "分母不能为0,默认设置为1" << endl;
        dom = 1;
        num = numerator;
    } else {
        num = numerator;
        dom = denominator;
        reduce();
    }
}

// 辗转相除法计算最大公约数
int Fraction::gcd(int a, int b) {
    a = abs(a);
    b = abs(b);
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 约分并统一符号到分子
void Fraction::reduce() {
    if (dom < 0) {
        num *= -1;
        dom *= -1;
    }
    int commonDivisor = gcd(num, dom);
    if (commonDivisor != 0) {
        num /= commonDivisor;
        dom /= commonDivisor;
    }
}

// 分数加法:a/b + c/d = (ad + bc)/bd
Fraction Fraction::add(Fraction myFrac) {
    int newNum = num * myFrac.dom + myFrac.num * dom;
    int newDom = dom * myFrac.dom;
    Fraction result(newNum, newDom);
    result.reduce();
    return result;
}

// 分数减法:a/b - c/d = (ad - bc)/bd
Fraction Fraction::subtract(Fraction myFrac) {
    int newNum = num * myFrac.dom - myFrac.num * dom;
    int newDom = dom * myFrac.dom;
    Fraction result(newNum, newDom);
    result.reduce();
    return result;
}

// 分数乘法:a/b * c/d = ac/bd
Fraction Fraction::multiply(Fraction myFrac) {
    int newNum = num * myFrac.num;
    int newDom = dom * myFrac.dom;
    Fraction result(newNum, newDom);
    result.reduce();
    return result;
}

// 分数除法:a/b / c/d = ad/bc(处理除数为0的情况)
Fraction Fraction::divide(Fraction myFrac) {
    if (myFrac.num == 0) {
        cerr << "不能除以0,返回原分数" << endl;
        return *this;
    }
    int newNum = num * myFrac.dom;
    int newDom = dom * myFrac.num;
    Fraction result(newNum, newDom);
    result.reduce();
    return result;
}

void Fraction::printFraction() {
    cout << num << "/" << dom;
}

void Fraction::printFractionAsFloat() {
    float value = static_cast<float>(num) / static_cast<float>(dom);
    cout << fixed << setprecision(3) << value;
}

修正后的代码可通过编译,且算术运算逻辑符合分数规则,输出结果与教师提供的示例一致。

内容的提问来源于stack exchange,提问作者Marshall Hitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:47