C ++ Overload =运算符

时间:2011-04-27 23:32:20

标签: c++ operator-overloading compiler-errors const

我不确定为什么在尝试重载=运算符

时出现以下错误
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;
}

6 个答案:

答案 0 :(得分:7)

您需要向const方法添加getRadius()限定符,例如

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

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

答案 1 :(得分:2)

因为您的getRadius()未声明为const

将声明更改为:

double getRadius() const;

并将其定义更改为

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

您通过getRadius()引用呼叫const。由于您当前没有声明为const的方法,因此您将收到该错误。

答案 2 :(得分:2)

您应该将getRadius函数声明并定义为const:

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

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

答案 3 :(得分:1)

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

在这种情况下,您可以通过在方法签名

中添加const关键字将getRadius更改为const
double MyCircle::getRadius() const
{
    return radius;
}

答案 4 :(得分:1)

在operator =中,rhs被声明为const,但是调用了radius()而没有声明为const。 Const正确性是一种痛苦。

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

答案 5 :(得分:0)

您需要将getRadius()标记为const访问者:

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

...

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

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