2016-12-16 85 views
3

當我遇到問題時,我試圖創建一個簡單的向量類。 這是我的代碼片段:將運算符重載爲類成員

class Vector2D{ 
protected: 
    int x, y; 
public: 
    Vector2D operator - (const Vector2D&);  
    friend int SumDiff(const Vector2D& obj1, const Vector2D& obj2); 
}; 

Vector2D Vector2D::operator - (const Vector2D& param) 
{ 
    Vector2D obj; 

    obj.x = x - param.x; 
    obj.y = y - param.y; 
    return obj; 
} 

int SumDiff(const Vector2D& obj1, const Vector2D& obj2) 
{ 
    int result; 
    Vector2D obj3; 

    obj3 = obj1 - obj2; 

    result = obj3.x + obj3.y; 
    return result; 
} 

obj3 = obj1 - obj2;被突出顯示爲錯誤。具體而言,該行中的運算符-似乎不會將Vector2D對象作爲操作數。

即使SumDiff函數是Vector2D類的一部分,也會發生同樣的問題。

如果運算符-作爲非成員函數重載,此代碼似乎只能編譯。爲什麼?

在此先感謝。

回答

3

您的運營商必須聲明爲const:

Vector2D operator - (const Vector2D&) const; 

否則,你不能obj2,這是const使用它。

正如評論說NathanOlivier,你也可以聲明這個操作符類外爲:

Vector2D operator - (const Vector2D& left, const Vector2D& right) 
{ 
    Vector2D obj; 

    obj.x = left.x - right.x; 
    obj.y = left.y - right.y; 
    return obj; 
} 

然後,你需要使它成爲你的類的一個朋友(或添加設置器/吸氣),從而使可以訪問xy

+0

或者使用標準約定並將其聲明爲自由函數。 – NathanOliver

+0

對不起,錯過了那一點。 – Angew

1

operator -成員函數沒有標記爲const,這意味着它:

  • 指出,它可以修改的*this的狀態(左側opearnd)
  • 因此不能用const被稱爲-qualified對象作爲左側操作數

由於operator -應該肯定要麼修改它的操作數,只需將其標記const

Vector2D operator - (const Vector2D&) const; 

注意,在一般情況下,它通常是更好地執行二元運算符非成員在可能的情況。原因是隱式轉換中的對稱性。作爲成員實現的二元運算符可以在其右側操作數上使用隱式轉換,但不能在左側使用它們(因爲操作數首先需要正確類型來查找運算符)。

既然你通常還需要存在的複合賦值運算符,一個常見的模式是實現非成員二元運算符的複合賦值而言,這樣的:

Vector2D& Vector2D::operator -= (const Vector2D &rhs) 
{ 
    x -= rhs.x; 
    y -= rhs.y; 
    return *this; 
} 

Vector2D operator - (Vector2D lhs, const Vector2D &rhs) 
{ 
    lhs -= rhs; 
    return lhs; 
} 

最後,在使用生產,請考慮使用Boost.Operators爲您完成大部分自動委託。