c++ - 重载 << 和 >> 运算符 : The program compiles but running it doesn't accept input

标签 c++

我正在尝试实现一个 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/

相关文章:

c++ - glew.h 和 glext.h 之间不兼容的函数原型(prototype)

c++ - 我的长方体哪里出了问题?

c++ - 插入 std::vector 时 std::unique_ptr 的正确用法是什么

c++ - C++ 中的新运算符和数组

c++ - 如何以编程方式更改非默认声音设备的音量?

c++ - 需要复制构造函数的帮助以实现单链表的非常基本的实现

c++ - Qt 5.1.1 with Visual Studio 2012 - 这些 QT 版本不可访问

c++ - 段错误(核心已转储)- 通过对象访问结构成员时

c++ - 不能因为类不是多态而沮丧?

派生类实例化的 C++ 语法异常