2011-04-27 123 views
0

我不知道为什么我在尝试重载=操作C++重载=操作

error: passing ‘const MyCircle’ as ‘this’ argument of ‘double MyCircle::getRadius()’ discards qualifiers| 

代码时出现以下错误:

#include <iostream> 

#define PI 3.14 

using namespace std; 


class MyCircle 
{ 
    public: 
    MyCircle(); 
    MyCircle(int r); 
    MyCircle(const MyCircle& c); 
    void setRadius(double r); 
    double getRadius(); 
    double getArea(); 
    static void increaseInstanceCount(); 
    static int getInstanceCount(); 
    MyCircle operator=(const MyCircle &); 

    private: 
    double radius; 
    static int instanceCount; 
}; 

int MyCircle::instanceCount = 0; 

/** 
1. A default constructor, that sets the radius to 0 
**/ 
MyCircle::MyCircle() 
{ 
    radius = 0.0; 
    increaseInstanceCount(); 
} 

/** 
2. A one argument costructor that accepts an int and uses it to initialize the radius 
**/ 
MyCircle::MyCircle(int r) 
{ 
    radius = r; 
    increaseInstanceCount(); 
} 

/** 
3. A copy constructor that accepts a Circle reference as an argument, and uses it to initialize radius 
**/ 
MyCircle::MyCircle(const MyCircle& c) 
{ 
    radius = c.radius; 
    increaseInstanceCount(); 
} 

void MyCircle::increaseInstanceCount() 
{ 
    instanceCount++; 
} 

int MyCircle::getInstanceCount() 
{ 
    return instanceCount; 
} 
void MyCircle::setRadius(double r) 
{ 
    radius = r; 
} 

double MyCircle::getRadius() 
{ 
    return radius; 
} 

double MyCircle::getArea() 
{ 
    return (radius * radius) * PI; 
} 

//overload = operator 
MyCircle MyCircle::operator=(const MyCircle &rhs) 
{ 
    if(this == &rhs) 
     return *this; 

    radius = rhs.getRadius(); 
    return *this; 

} 

int main() 
{ 
    MyCircle circle; 
    circle.setRadius(5.4); 
    MyCircle circle2; 
    circle2.setRadius(3.0); 
    MyCircle circle3; 
    circle3.setRadius(343.3); 

    cout << "Total instances: " << circle.getInstanceCount() << endl; 
    return 0; 
} 
+0

5在相同的10秒内回答:) – sehe 2011-04-27 23:37:56

回答

7

你需要一个const限定符添加到getRadius()方法,像

double MyCircle::getRadius() const 
{ 
    return radius; 
} 

这将有资格与const对象调用的方法。您可能希望将此限定符添加到不更改成员变量的任何方法,从而避免此类错误。

+0

谢谢,所有... – Tony 2011-04-27 23:48:01

+0

这也适用于priority_queues中使用的'()'操作符的重载。如果您在运行'()'重载方法内的对象方法时遇到问题,则此答案将修复它!您可以使用'()'重载方法内的所有对象的'const'标记方法。 这个答案真的很棒,很完整......谢谢巴尔加斯! – Bengalaa 2013-11-24 15:20:52

2

因为你getRadius()未声明const

改变它的声明:

double getRadius() const; 

,并改变它的定义

double MyCircle::getRadius() const 
{ 
    return radius; 
} 

您通过const引用调用getRadius()。由于您目前没有将方法声明为const,因此会出现该错误。

1

getRadius不是const方法,而rhs是const。因此,非const方法可能会改变类的内容,而const方法会告诉编译器将实例的任何更改标记为错误。

在这种情况下,您可以更改getRadius通过在方法署名附加const关键字为const

double MyCircle::getRadius() const 
{ 
    return radius; 
} 
2

还应当声明并定义getRadius功能为const:

double MyCircle::getRadius() const 
{ 
    return radius; 
} 

在一个注意,你没有理由为这个类定义一个自定义operator=,默认情况下会正常工作。此外,如果你定义operator=,它应该可能通过引用返回。

0

您需要标记getRadius()作为一个常量访问:

double getRadius() const; 
double getArea() const; 

...

double MyCircle::getRadius() const 
{ 
    return radius; 
} 

double MyCircle::getArea() const 
{ 
    return (radius * radius) * PI; 
} 
1

在运营商=,RHS被声明为const,但半径()被调用,而不是声明const。 Const正确性是一种痛苦。

既可以声明radius()const,也可以直接读取radius实例变量,就像在拷贝构造函数中一样。