2016-08-25 112 views
1

我尝试操作符重载,为此,我下面的代码写包括常量给出错误(C++)

class OwnClass 
{ 
private: 
    int x,y; 
public: 
    OwnClass(int x, int y) { SetX(x); SetY(y); } 
    int GetX() { return x; } 
    void SetX(int x) { this->x = x;} 
    int GetY() { return y; } 
    void SetY(int y) {this->y = y;} 

    OwnClass& operator + (const OwnClass &o) // Problematic line 
    { 
     this->x += o.GetX(); 
     this->y += o.GetY(); 

     return *this; 
    } 
}; 

在编译时,下面的错误显示

乐趣的.cpp(65):错误C2662: 'OwnClass ::的getX':不能 '这个' 从 '常量OwnClass' 指针转换为 'OwnClass &' 转化失去限定符

fun.cpp(66):错误C2662: 'OwnClass ::杰蒂':不能转换 从 'const的OwnClass' 到 'OwnClass &' 转换 '这个' 指针失去 限定符

当我修改代码作为下,它编译好。

OwnClass& operator + (OwnClass &o) // removed const 
{ 
    this->x += o.GetX(); 
    this->y += o.GetY(); 

    return *this; 
} 

我看不懂为什么这么说?我的意思是我无法理解编译器错误。

+3

'operator +'应该返回一个新的对象,而不是同一个对象。它是'operator + ='应该返回当前对象(通过引用)。 – PaulMcKenzie

+0

@PaulMcKenzie感谢您的额外信息! – SimpleGuy

回答

4

参数o被声明为参考const,因为它们是非const成员函数,所以不能用GetXGetY调用。您可以(也应该)将它们更改为const成员函数来解决问题。

int GetX() const { return x; } 
int GetY() const { return y; } 

BTW:在一般二元operator+是不应该返回非const的引用。按价值返回一个新对象会更好。

这种情况 operator+
OwnClass operator + (const OwnClass &o) const 
{ 
    OwnClass r(GetX(), GetY()); 
    r.x += o.GetX(); 
    r.y += o.GetY(); 

    return r; 
} 

注意可以(也应该)被声明为const成员函数了。正如@ M.M所建议的那样,使它成为非成员函数会更好。

+0

哦!我怎么会错过这个..谢谢! – SimpleGuy

2

问题是您正在const对象上调用非const成员函数。让getter const来解决这个问题:

int GetX() const { return x; } 
int GetY() const { return y; } 
+0

哦!我怎么会错过这个..谢谢! – SimpleGuy