gpt4 book ai didi

c++ - 重载运算符 = 错误

转载 作者:行者123 更新时间:2023-11-30 00:55:51 25 4
gpt4 key购买 nike

我正在尝试使用重载概念来等同于 3 个对象 c1c2c3。但它给我一个错误

error: no match for 'operator=' in 'c3 = c2. circle::operator=(((circle&)(& c1)))'

这是什么原因,我该如何纠正?

#include<iostream>
using namespace std;

class circle
{
private:
int radius;
float x,y;
public:
circle()
{}
circle(int rr,float xx,float yy)
{
radius=rr;
x=xx;
y=yy;
}
circle& operator=(const circle& c)
{
cout<<endl<<"assignment operator invoked";
radius=c.radius;
x=c.x;
y=c.y;
return *this;
}
void showdata()
{
cout<<endl<<"\n radius="<<radius;
cout<<endl<<"x coordinate="<<x;
cout<<endl<<"y coordinate="<<y<<endl;
}
};
int main()
{
circle c1 (10,2.5,2.5);
circle c2,c3;
c3=c2=c1;
c1.showdata();
c2.showdata();
c3.showdata();
return 0;
}

所以这个重载运算符将被调用两次..首先对于 c2=c1然后对于 c3=c2 但编译器将如何将它与重载运算符定义进行比较??

最佳答案

为了链接 operator= 调用,您必须确保它返回一个引用

circle& operator=(const circle& c)
{
cout<<endl<<"assignment operator invoked";
radius=c.radius;
x=c.x;
y=c.y;
return *this;
}

c1=c2=c3 被解析为 c1 = (c2 = c3)。如果 operator = 不返回引用,则 c2 = c3 是一个右值,它不能绑定(bind)到 c1.operator = 的引用参数> (如果参数是对 const 的引用,它可以绑定(bind)到右值,但这并不意味着您不应该返回引用)。

另请注意,通过 const 引用获取参数是有意义的,因为您不想更改分配的参数。

还记得the rule of three ,也就是说,如果您确实需要执行以下任一操作:

  • 重载operator =

  • 显式提供拷贝构造函数

  • 明确提供析构函数

那么您可能还想做另外两个。在您的特定情况下,您似乎根本不需要重载 operator =

关于c++ - 重载运算符 = 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466599/

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