作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个 Fraction
类,它计算两个分数的乘积。它编译正常,但不接受输入并突然结束。
这是我的代码:
#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;
}
friend istream &operator>>(istream &in,const Fraction &f);
};
istream &operator>>(istream &in,const Fraction &f){
in>>f.m_numerator;
in>>f.m_denominator;
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;
Fraction f2;
cin>>f2;
std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n';
return 0;
}
谁能告诉我哪里错了?
最佳答案
问题在于 operator>>
第二个参数上的 const
限定符。首先,这看起来有点奇怪,因为您想要在将值作为输入给出时修改它们。其次,由于采用 const int
操作数的 >>
运算符没有默认重载,因此最佳(仅?)匹配内部 >>
操作是函数本身 - 这会导致无限递归。
要解决此问题,只需删除 const
限定符即可:
istream& operator>>(istream& in, Fraction& f)
{
in >> f.m_numerator;
in >> f.m_denominator;
return in;
}
(同样,在声明中。)
注意:为了解决注释中提出的问题,关于正确读取用斜杠指定的分数(即像 3/4
这样的输入),您可以简单地在两行之间添加以下行读取分子和分母:
char slash; in >> slash; // Skip the slash.
关于c++ - 重载 << 和 >> 运算符 : The program compiles but running it doesn't accept input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69064456/
我是一名优秀的程序员,十分优秀!