2011-07-27 35 views
1

簡而言之:
如何定義運算符=我的課,使得它編譯只有當RHS爲0(OBJ = 0)
但給如果rhs非0值,則編譯錯誤。
我知道這是可能的,忘記了如何。我想要爲這個類的對象(這意味着重置對象)允許賦值obj = 0,但是沒有定義其他整數或指針的賦值。除了obj = 0以外,沒有定義整數或指針的轉換。定義賦值操作符=只允許零RHS,否則將無法編譯

C obj; 
obj = 0; // reset object 

operator=裏面,我可以做assert(rhs == 0),但是這還不夠好。
我知道有可能 來定義operator=這樣
它給編譯錯誤,如果rhs不是0.忘記詳細信息。
有人可以補充嗎?

感謝

+7

爲什麼會有人想這麼做?如果它重置對象,請編寫一個名爲'reset'的方法。或者,您是否打算混淆嘗試閱讀您的代碼的人? – Axel

+0

@Axel:'= 0'操作對於智能指針很常見。對於類似於某種類型ID的類。通過與常規指針類比,在wihch = 0上是「重置過載」。所以對於ID類和SmartPointer類,這是我所說的很好的實踐。 OTOH,你是否有150個類,每個都有「重置」方法,當你需要跟蹤在特定的p-> reset()調用中調用reset()時,它是如何優於= 0的?沒有看到太多的差異。 – Andrei

回答

7

使用指針到成員

class foo 
{ 
    // Give it a meaningful name so that the error message is nice 
    struct rhs_must_be_zero {}; 

    // The default operator= will still exist. If you want to 
    // disable it as well, make it private (and the copy constructor as well 
    // while we're at it). 

    foo(const foo&); 
    void operator=(const foo&); 

public: 
    foo& operator=(int rhs_must_be_zero::*) { return *this; } 
}; 

既然你不能訪問foo::rhs_must_be_zero,你不能從命名這個類的指針成員。唯一指向成員的指針可以是空指針,也就是文字零。

Demo at http://ideone.com/bT02z

+0

+1非常酷。 :-) –

+0

但是編譯的例子是'foo f,g; f = g'。看來你也應該使'foo&operator =(const foo&)'爲私人。 – Lol4t0

+0

@ Lol4t0:這不是OP所要求的。無論如何我都會更新答案,謝謝你的建議。 –

相關問題