我的分数类重载运算符不会编译,说它们必须是一元或二元运算符。 (C ++) 在搜索之后,我发现让他们成为朋友的建议将删除隐含的第一个术语,但我的操作员一直都是朋友,但仍然返回“错误:重载'运算符 - '必须是一元或二元 operator(有3个参数)“当我去编译。
这里是他们的头文件
friend std::ostream& operator<<(std::ostream& os, const Fraction& frac); //printing
friend std::istream& operator>>( std::istream& is, Fraction& frac); // reading
friend const Fraction operator+(const Fraction& x, const Fraction& y); // adding
friend const Fraction operator-(const Fraction& x, const Fraction& y); // subtract
以下是每个
的定义std::ostream& Fraction::operator<<(std::ostream& os, const Fraction& frac) //printing
{
if(num % den == 0)
cout << num/den << endl;
else
cout << num << "/" << den << endl;
}
std::istream& Fraction::operator>>( std::istream& is, Fraction& frac) // reading
{
int pc; //peek character
is >> skipws >> num; // read numerator, skipping whitespace
pc = is.peek(); // check next character
if( is && isspace(pc)) //if whitespace after the numerator
{
while( is && isspace(pc))
{
is.get(); // eat space
pc = is.peek(); // move through the stream
}
}
else if( is && pc == '/')
{
is.get(); // eat the '/'
is >> skipws >> den;
}
if(den == 0)
{
throw invalid_argument("denominator is zero");
}
if(den < 0)
{
num = num * -1;
den = den * -1;
}
}
const Fraction Fraction::operator+(const Fraction& x, const Fraction& y) // adding
{
Fraction temp1;
Fraction temp2;
if(x.getden() == y.getden())
{
temp1.set(x.getnum() + y.getnum(), x.getden() );
}
else
{
temp1.set(x.getnum() * y.getden(), x.getden() * y.getden());
temp2.set(y.getnum() * x.getden(), y.getden() * x.getden());
temp1.set(temp1.getnum() + temp2.getnum(), temp1.getden());
}
reduceFrac(temp1);
return temp1;
}
const Fraction Fraction::operator-(const Fraction& x, const Fraction& y) // subtracting
{
Fraction temp1;
Fraction temp2;
if(x.getden() == y.getden())
{
temp1.set(x.getnum() - y.getnum(), x.getden() );
}
else
{
temp1.set(x.getnum() * y.getden(), x.getden() * y.getden());
temp2.set(y.getnum() * x.getden(), y.getden() * x.getden());
temp1.set(temp1.getnum() - temp2.getnum(), temp1.getden());
}
reduceFrac(temp1);
return temp1;
}
答案 0 :(得分:0)
朋友功能不是类的实例成员。它们是静态的,是其他类的成员,或者没有类。
让他们成为朋友不会'删除隐含的第一个词',无论这意味着什么。让他们实例成员删除显式第一个术语(通过使其隐含:this
),这是你的实际问题:他们是成员,他们有一个明确的第一学期。要么将它们设为静态,要么删除friend
和第一个术语。
让成员成为他们自己班级的朋友是多余的。