2012-07-13 31 views
1

我正在尝试使用超载概念来将3个对象等同起来c1,c2,c3。 但它给我一个错误OVERLOADING OPERATORS =错误

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 = ,然后C3 = C2,但如何将编译器,重载的操作符定义进行比较?

回答

6

为了链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是一个右值,并且它不能绑定到参考参数c1.operator =(如果参数是对const的引用,它可以绑定到右值,但这并不意味着您不应该不会返回参考)。

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

还记得the rule of three,也就是说,如果你真的需要做任何以下内容:

  • 超载operator =

  • 明确提供一个拷贝构造函数

  • 明确规定析构函数

那么你可能也想做另外两个。在你的具体情况下,你似乎根本不需要超载operator =

+0

我会添加提及采用'const const''也是。 – 2012-07-13 08:16:22

+0

他甚至如何访问类变量?他们被设置为私人... – 2012-07-13 08:18:35

+0

@ArmenTsirunyan你的讽刺话不会帮助任何人。如果你注意到,我正在谈论他通过的课程。 – 2012-07-13 08:23:01