重载输入流运算符>>

时间:2014-10-30 00:04:58

标签: c++

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

// 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并在另一个文件中编译驱动程序函数时,我遇到了很多错误。为什么这不起作用?请彻底解释你的答案,我想学习。

更新:
**错误:变量,numo deno和ch是'private'

2 个答案:

答案 0 :(得分:5)

你有一个简单的不匹配。声明为朋友的函数将引用作为其第二个参数的Fraction。您实现的功能取代了一小部分,因此它不是Fraction类的朋友。您希望获得引用的版本,因为当您使用通常想要传递变量的函数时,您希望它修改该变量。

我通常更愿意实施这样的事情:

class Fraction { 

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

     // ...
};

即使它的主体位于类定义中,但由于它被声明为friend,因此它仍然是非成员函数。

答案 1 :(得分:0)

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

原型:

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

功能定义:

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

    return input; 
}