【问题标题】:Operator overloading for user defined class don't work in C++ [duplicate]用户定义类的运算符重载在 C++ 中不起作用 [重复]
【发布时间】:2020-03-19 16:01:16
【问题描述】:
class Fraction
{
private: 
    int numer;                                                    //fraction numerator
    int denom;                                                    //fraction denominator

public:
    Fraction(int num, int den): numer(num), denom(den) {};

    friend Fraction operator+(Fraction& frac1, Fraction& frac2);  // add fraction
    friend Fraction operator-(Fraction& frac);                    // negative fraction 
    friend Fraction operator-(Fraction& frac1, Fraction& frac2);  // subtract fraction
};


Fraction operator+(Fraction& frac1, Fraction& frac2)              // everything OK
{
    return Fraction(frac1.numer * frac2.denom + frac2.numer * frac1.denom, frac1.denom * frac2.denom);
}


Fraction operator-(Fraction& frac)                                // everything OK
{
    return Fraction(-frac.numer, frac.denom);
}


Fraction operator-(Fraction& frac1, Fraction& frac2)              // here begin some problems
{
    return frac1 + (-frac2);
}

除了最后一个功能外,一切正常。它看不到变量,只是给出编译器错误:

错误 C2679 二进制“+”:未找到采用“分数”类型的右侧操作数的运算符(或没有可接受的转换)

有什么问题?

【问题讨论】:

    标签: c++ class operator-overloading


    【解决方案1】:

    你不能将一个非常量引用绑定到一个临时的,像这样改变你的代码

    friend Fraction operator+(const Fraction& frac1, const Fraction& frac2);
    

    与所有其他运算符相同。

    frac1 + (-frac2); 中,-frac2 的值是临时的。它是在临时位置评估表达式期间创建的对象。 C++ 不允许将临时对象绑定到非常量引用。因此,在以下情况下,请始终对参数使用 const 引用:

    1. 该函数不需要修改对象的任何成员变量。
    2. 函数不需要调用对象的任何非const成员函数。

    【讨论】:

      【解决方案2】:

      我不同意约翰的回答。更好的解决方案是简单地删除引用。通过值传递对于两个整数对象非常有意义:

      inline friend Fraction operator+(Fraction frac1, Fraction frac2);
      

      (您需要 inline,因为代码看起来像是来自 "Fraction.h" 标头。如果没有内联,如果您包含 Fraction.h 两次,则会违反 ODR。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2013-07-18
        • 2013-06-17
        • 1970-01-01
        相关资源
        最近更新 更多