gpt4 book ai didi

c++ - 在 C++ 中重载 operator+

转载 作者:太空宇宙 更新时间:2023-11-04 14:38:07 29 4
gpt4 key购买 nike

我的一项考试练习任务有点问题。这是一段文字:

Class MyFloat have a private variable float num. You have to write methods which will enable next lines of code: 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");
}

我在这一行中遇到错误:

float z = 3.4 + y;

它说:

error C2677: binary '+' : no global operator found which takes type 'MyFloat' (or there is no acceptable conversion)

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

最佳答案

实现 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 内置 float 的前缀,例如 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;
}

关于c++ - 在 C++ 中重载 operator+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641212/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com