重载输入流运算符>>

Overloading the input stream operator >>

本文关键字:gt 运算符 输入流 重载      更新时间:2023-10-16

我正在尝试重载>>运算符,以便当用户输入分数时,cin将分数存储到fraction类型的对象中。
头文件摘录:

// Calculator.h
friend istream &operator>>( istream &, Fraction &);
private:
    signed int numo; // fraction numerator
    signed int deno; // fraction denomenator
    char ch; // the '/' character

执行文件摘录:

 //Calculator.cpp
// insertion operator overloading
istream &operator>>( istream &input, Fraction fraction)
{
    input >> fraction.numo;
    input >> fraction.ch;
    input >>fraction.deno;
    return input; 
}

当我试图编译Calculator.cpp并在另一个文件中编译驱动程序函数时,我遇到了很多错误。为什么不起作用?请把你的答案解释清楚,我想学习一下。

更新:
**错误:变量numodeno和ch是"私有"

您有一个简单的不匹配。声明为友元的函数将对Fraction引用作为其第二个参数。您所实现的函数是按值取分数的,所以它不是Fraction类的朋友。你想要一个引用的版本,因为当你使用函数时,你通常想要传递一个变量,并且你希望它修改那个变量。

我通常更喜欢在适当的地方实现这样的东西:

class Fraction { 
     friend std::istream &operator>>(std::istream &is, Fraction &f) { 
        return is >> f.numo >> f.ch >> f.deno;
     }
     // ...
};

即使它的主体在类定义中,它仍然是一个非成员函数,因为它被声明为friend

Andy在Calculator.h头文件中,使用Fraction&(ref类型)作为函数的第二个参数。所以在函数定义中,它必须是相同的(不要使用值类型)。

原型:

friend istream& operator>>(istream&, Fraction ); 

功能定义:

istream& operator>>(istream& input, Fraction& fraction)
{
    input >> fraction.numo;
    input >> fraction.ch;
    input >>fraction.deno;
    return input; 
}