2013-03-25 102 views
2

例如,我已經定義的類爲了在if語句中使用我的類,重載哪一個運算符?

class MyClass 
{ 
    .... 
}; 

哪個運營商我要在爲了做到與MyClass對象如果比較超載?

如:

MyClass cc; 
if (cc) // compile error 
{ 
    //do some stuff 
} 

我試着用

bool operator == (int value) ; //guess the if() will call this 

bool operator != (int value) ; 

但兩者給我一個編譯錯誤!

+0

@FrédéricHamidi:在C++ 11的存在下,這個問題的答案看起來不同(現在建議使用明確的運算符bool而不是安全bool慣用法)。我不知道SO如何處理這種信息隨着時間的變化...... – PlasmaHH 2013-03-25 14:03:57

+0

你的例子沒有比較。如果你想隱式轉換到'bool',定義'operator bool()'。順便說一句,你永遠不會覆蓋操作員。您可以覆蓋或超載一個。這些術語有不同的含義。 – 2013-03-25 14:04:55

+0

@PlasmaHH,在David Rodriguez的回答下的評論中指出。這應該沒問題。 – 2013-03-25 14:06:07

回答

3

operator bool()是你想要的。它會照顧你班級的類型轉換,輸入bool

5

你應該提供一個bool轉換操作符:

struct MyClass 
{ 
    explicit operator bool() const { return true; } 
}; 

這裏,explicit操作來避免不必要的隱式轉換爲其他類型,特別是數字類型。請注意,這隻能在C++ 11中使用。

+0

'顯式'?你確定這個嗎? – 2013-03-25 14:01:00

+2

@ bash.d是的,'explicit'在這裏是正確的。 'if'表達式被「上下文轉換爲bool」,爲此可以使用明確的操作符。它可以防止所有隱式轉換的混亂。 – Angew 2013-03-25 14:02:04

+0

@Angew真棒!不知道這一個...你是否在Stroustrup的書中找到了它? – 2013-03-25 14:03:08

1

你可以覆蓋operator bool(),但根據你的例子,你也可以考慮創建一個簡單的方法,將返回bool。那麼它的用法可能是這樣的:例如:

MyClass cc; 
if (cc.isValid()) 
{ 
    // do some stuff 
} 

在這種情況下這將更直接並且更容易閱讀。自定義操作符適用於很多事情,但不要強制執行。有時,最好只keep it simple :)

3

你必須爲bool或東西轉換爲bool提供一個轉換操作符。如果你有C++ 11,最好的辦法是這樣的:

class MyClass 
{ 
public: 
    explicit operator bool() const { 
    ... 
    } 
}; 

如果沒有C++ 11(或至少其顯式轉換運營商的支持),事情變得有點複雜點(因爲當你最不期待它的時候,隱式轉換會讓你感到痛苦)。有關詳細信息,請參見safe bool idiom

+0

我不知道C++ 11爲'explicit'關鍵字添加了一個新用法。 – 2013-03-25 14:32:34

+0

@MarkRansom是的,它的確如此,您現在可以擁有顯式的轉換運算符,而不僅僅是構造函數。 IMO非常有用。 – Angew 2013-03-25 14:50:41