2015-10-17 67 views
2

比方說,我有一個類數重載運算符+類

class Number 
{ 
public: 
    int numb; 

    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 
}; 

當我嘗試使用我的重載操作

cout << 3 + s; // doesn't work 
cout << s + 3; 

我明白爲什麼它不工作,但我不」 t知道如何使它的工作3 + s

當然,我可以在類外寫2個參數的運算符+,但我想讓我的運算符在類中重載。

我已經使用了它,但沒有找到任何解決方案。

回答

1

最簡單的方法:寫你的類以外的另一個重載

class Number 
{ 
public: 
    int numb; 

    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 
}; 

int operator+(int h, Number& n) 
{ 
    return n.numb+h; 
} 

int main() 
{ 
    int s = 42; 
    std::cout << 3 + s; 
    std::cout << s + 3; 
} 

Live Example

這也適用,如果你的數據是私有的(但要確保外部函數訪問給那些會員)

class Number 
{ 
    int numb; 

public: 
    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 

    friend int operator+(int, Number&); 
}; 

int operator+(int h, Number& n) 
{ 
    return n.numb+h; 
} 
+0

你的朋友並不總是公開露面,做友情可能不是最好的選擇。 – g24l

0

只需在課堂外編寫一個調用課程中的操作符的操作符!去

template<typename T> T operator+(T a, Number& n) 
{ 
    return n+a; 
} 
1

當然,我可以在類之外編寫帶有2個參數的運算符+,但是我想讓我的運算符在類中重載。

這就好比說「當然,我可以在我的指甲用錘子錘,但我想用螺絲刀......」同時使用的成員和非

一些其他的解決方案建議會員,但這是多餘的:如果你添加非會員,那麼你不再需要會員!

proper way超載operator+是使用非成員:

Number operator+(Number a, Number b) 
{ 
    return a.numb + b.numb; 
} 

另一種方式來寫這個是使用operator+=作爲幫助(那麼你的類將支持+=太):

Number operator+(Number a, Number b) 
{ 
    return a += b; 
} 

與成員函數:

Number &operator+=(Number b) 
{ 
    numb += b.numb; 
    return *this; 
} 

您可以使operator+返回Numberint,您的選擇。