C++重载<<和>>运算符后程序可编译但无法接收输入如何解决
错误原因
你的代码核心问题出在输入运算符operator>>的参数定义上:
输入运算符的作用是修改传入的Fraction类对象的成员变量,所以你不能给第二个参数加const修饰。const修饰的引用代表该对象只读不可修改,强制修改const对象属于未定义行为,这就是你程序运行直接崩溃的原因。
修复步骤
- 修改类内
operator>>的友元声明,移除参数的const修饰:
// 原声明 friend istream &operator>>(istream &in,const Fraction &f); // 修改为 friend istream &operator>>(istream &in,Fraction &f);
- 修改类外
operator>>的实现,同样移除参数的const修饰:
// 原实现 istream &operator>>(istream &in,const Fraction &f){ // 修改为 istream &operator>>(istream &in,Fraction &f){
补充优化建议
可以在输入完成后加一层分母为0的校验,避免后续运算出现除以0的异常,示例如下:
istream &operator>>(istream &in,Fraction &f){ in>>f.m_numerator; in>>f.m_denominator; if(f.m_denominator == 0) { in.setstate(ios::failbit); // 标记输入失败 } return in; }
修正后完整可运行代码
#include<iostream> #include<cmath> using namespace std; class Fraction{ int m_numerator{0},m_denominator{1}; public: Fraction(int numerator=0,int denominator=1):m_numerator{numerator},m_denominator{denominator}{ } friend Fraction operator*(const Fraction &f1,const Fraction &f2); friend Fraction operator*(const Fraction &f,int n); friend Fraction operator*(int n,const Fraction &f); friend ostream &operator<<(ostream &out,const Fraction &f){ out<<f.m_numerator<<'/'<<f.m_denominator; return out; } // 移除const修饰 friend istream &operator>>(istream &in,Fraction &f); }; // 移除const修饰 istream &operator>>(istream &in,Fraction &f){ in>>f.m_numerator; in>>f.m_denominator; // 可选分母校验 if(f.m_denominator == 0) { in.setstate(ios::failbit); } return in; } Fraction operator*(const Fraction &f1,const Fraction &f2){ return Fraction{f1.m_numerator*f2.m_numerator,f1.m_denominator*f2.m_denominator}; } Fraction operator*(const Fraction &f,int n){ return Fraction(n*f.m_numerator,f.m_denominator); } Fraction operator*(int n,const Fraction &f){ return Fraction(n*f.m_numerator,f.m_denominator); } int main(){ Fraction f1; cin>>f1; if(cin.fail()) { cout<<"输入的第一个分数非法,分母不能为0"<<endl; return 1; } Fraction f2; cin>>f2; if(cin.fail()) { cout<<"输入的第二个分数非法,分母不能为0"<<endl; return 1; } std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Sanket Kittad
相关产品推荐
相关产品推荐

