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
错误原因分析
- C2512错误:驱动代码中
Fraction z;需要调用无参默认构造器,但当前类仅定义了双参数构造器,编译器不会自动生成默认构造器。 - C2665错误:驱动代码中
Fraction w(5);需要单参数构造器(表示分母为1的分数),但当前类无此重载版本。 - 额外问题:当前算术运算逻辑错误(如加法直接分子分母相加),无法得到示例中的正确结果,且未处理分数约分和符号统一。
修复方案
修正后的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
相关产品推荐
相关产品推荐

