2016-08-25 44 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