我正在尝试重载>>运算符,以便当用户输入分数时,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'
答案 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;
}