根據MSDN doc on __interface,Visual C++接口「不能包含構造函數,析構函數或運算符」。爲什麼Visual C++接口不能包含運算符?
爲什麼接口不能包含運算符?返回參考的get方法之間有很大區別:
SomeType& Get(WORD wIndex);
和重載的索引器運算符?
SomeType& operator[](WORD wIndex);
根據MSDN doc on __interface,Visual C++接口「不能包含構造函數,析構函數或運算符」。爲什麼Visual C++接口不能包含運算符?
爲什麼接口不能包含運算符?返回參考的get方法之間有很大區別:
SomeType& Get(WORD wIndex);
和重載的索引器運算符?
SomeType& operator[](WORD wIndex);
__interface
修飾符是一個Visual C++擴展來幫助實現COM接口。這允許你指定一個COM接口並強制執行COM接口規則。
因爲COM是C兼容的定義,所以不能有運算符Ctor或Dtors。
這看起來像一個.dll的東西。您需要一個方法名稱,以便您可以使用其他不支持操作員重載的語言,例如C
。
接口不能包含運算符,因爲運算符不能是虛函數。基本上接口是其他類派生自的基類。
編輯:在閱讀了評論和思考這個之後,我意識到這是多麼愚蠢。請原諒我急切的手指。運營商與其他功能沒有區別。一個更可能的原因與從公共基類派生的__interface生成類有關,並且需要dll具有它們在本地使用的所有構造函數,析構函數和賦值運算符。
運算符**可以是虛擬的相關問題:http://stackoverflow.com/questions/669818/virtual-assignment-operator-c – sbk 2010-01-08 18:28:12
運算符在標準C++中可以是虛擬的。它們中的很多不應該是,因爲例如'operator ='應該引用與參數相同的類型,並且您可能會嘗試做多態分配時遇到各種麻煩。但'operator []'是多態性的合理候選者。無可否認,非虛擬接口習慣在純C++中通常是可取的,但對於非操作符函數也是如此。 – 2010-01-08 18:30:06
所以,如果我想與操作員建立「界面」,是我唯一的選擇純虛擬類嗎? – iano 2010-01-08 21:03:53
你的「唯一選擇」是編寫一個標準的C++類,是的。有很多方法取決於你需要什麼。一個純粹的抽象類是最接近Java/C#類型的接口,但在很多情況下,C++中更好的解決方案是不定義接口。使用模板提供的duck-typing,並簡單地定義一個類必須支持的概念,並且不要求它需要派生任何東西。或者使用CRTP慣用法爲靜態多態性提供接口。 – jalf 2010-01-08 23:05:03