在c ++中重载operator +

Ili*_*vic 0 c++ oop

我的一项任务是运动考试,我有一点问题.这是一个文字:

类MyFloat有一个私有变量float num.您必须编写将启用下一行代码的方法:MyFloat x = 3.5; MyFloat y = x + 3.2 float z = 3.4 + y

我写这段代码:

#include <iostream>
#include <Windows.h>
using namespace std;

class MyFloat
{
    float num;
public:
    MyFloat(float n)
    {
        num = n;

    }
    MyFloat operator+(MyFloat x)
    {
        float result;
        result = x.num + this->num;
        return result;
    }   
};

int main()
{
    MyFloat x = 3.75;
    MyFloat y = x + 3.2;
    float z = 3.4 + y;
    system("PAUSE");
}
Run Code Online (Sandbox Code Playgroud)

我在这一行得到错误:

float z = 3.4 + y;
Run Code Online (Sandbox Code Playgroud)

它说:

错误C2677:二进制'+':找不到采用'MyFloat'类型的全局运算符(或者没有可接受的转换)

我该怎么办?如何解决这个问题呢???

sas*_*hka 6

operator+使用2个参数实现非成员友元函数MyFloat operator+(MyFloat x, MyFloat y).

为什么它不适用于当前版本?因为在运算符左侧的对象上调用了成员运算符函数.在你的情况下,在左侧你有整数文字,这不是一个对象,所以缺乏MyFloat operator+(MyFloat x)成员函数.

运算符的非成员变体是对称的,并且不要求左侧是对象.对称性很重要,因为你在你的例子中看到的operator+并不是对称的,因为我们习惯于在数学中思考


编辑:但是,如Cassio Neri在评论中指出的那样,这还不够.为什么?看到他的答案的解释,但简而言之:你有模棱两可的问题.你可以使用他的解决方案或这个解决方案,如果你做这样的手动投射:float z = 3.4f + static_cast<float>(y);这是非常难看的.您可以使用另一个演员:float z = MyFloat(3.4f) + y如果您提供MyFloat::operator float转换.

另一种解决相同模糊问题的解决方案:在C++ 11中,您可以使用自己的后缀文字(例如,类似于f内置浮点数的前缀3.4_f;(下划线表示此后缀文字是用户定义的).示例实现(因为要实现运营商从铸造MyFloatfloat和向后:

MyFloat operator "" _f(long double val) {
    return MyFloat(static_cast<float>(val)); }

int main() {
    MyFloat x = 3.75;
    MyFloat y = x + 3.2;
    float z = 3.4_f + y; 
}
Run Code Online (Sandbox Code Playgroud)


Cas*_*eri 5

这可以是一个解决方案:

class MyFloat
{
    float num;
public:
    MyFloat(float n)
    {
        num = n;
    }

    operator float() const {
        return num;
    }
};

int main()
{
    MyFloat x = 3.75;
    MyFloat y = x + 3.2f;
    float z = 3.4f + y;
}
Run Code Online (Sandbox Code Playgroud)

最初,我也MyFloat operator+(MyFloat, MyFloat)想做一个非会员朋友的功能,但它仍然没有成功

float z = 3.4 + y;

编译.其原因是,3.4 + y将类型的MyFloat,因此,你不能把它分配给float z除非你提供一个转换操作符MyFloatfloat.然后Buth,3.4f + y变得模糊(至少在VS 2010),因为它可以调用MyFloat operator+(MyFloat, MyFloat),也可以转换yfloat并使用内置的操作+float秒.