(C ++)我重载的运算符函数都返回错误,即尽管是朋友,但它们必须是一元或二元的

时间:2017-01-31 23:53:12

标签: c++ operator-overloading binary-operators

我的分数类重载运算符不会编译,说它们必须是一元或二元运算符。 (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;

}

1 个答案:

答案 0 :(得分:0)

朋友功能不是类的实例成员。它们是静态的,是其他类的成员,或者没有类。

让他们成为朋友不会'删除隐含的第一个词',无论这意味着什么。让他们实例成员删除显式第一个术语(通过使其隐含:this),这是你的实际问题:他们是成员,他们有一个明确的第一学期。要么将它们设为静态,要么删除friend和第一个术语。

让成员成为他们自己班级的朋友是多余的。