2010-10-06 48 views
2

在Ojective-C中有一些稱爲Categories的類別,允許用戶從原始.h或.m文件(objective-c的.cpp版本)之外添加方法。我想知道在C++中是否存在這樣的功能。是否可以在沒有子類的情況下爲某個類添加一些功能?

我特別想實現< <運算符用於調試,也可能是我經常使用的庫中的其他類。 (並且不想使用宏,因爲它看起來很醜;))

謝謝。

回答

5

你總是可以重載班級以外的操作員。

std::ostream& operator<< (std::ostream& f, const YourClass& cls) { 
    ... 
} 

你仍然需要friend這個功能,如果它需要訪問YourClass的私有成員。

(但它不是可以定義像什麼Objective-C的不正常的成員函數)。

+1

只需添加Extraction(>>)和Insertion(<<)運算符不能通過成員函數重載。必須通過Friend功能超載。 – 2010-10-06 09:04:52

+0

+1澄清:「不可能定義正常的成員函數」 – nacho4d 2010-10-06 09:06:14

+0

@Als:只有因爲我們的自定義類在右邊,才能通過成員函數重載'''和'<<'運算符側。 – kennytm 2010-10-06 09:11:52

4

是的,這是可以添加的過載操作之類的< <外:

ostream& operator <<(ostream& lhs, const SomeClass& rhs) { 
    /* Output something to lhs using rhs object */ 
    return lhs; 
} 

唯一的問題是該函數不能訪問SomeClass的private/protected成員;要做到這一點,你必須在類中聲明這個函數friend。但是,如果您通過公共界面獲得所有必需的信息,那麼這不是問題。

3

是的,Namespace principle幾乎與此類似。這個想法是在與類相同的命名空間的類之外有緊密相關的類操作。操作符重載爲@KennyTM建議是這一原則塵(我看它的方式)

也看一下visitor design pattern

意向

代表行動是 執行上對象 結構的元素。訪問者可讓您定義 新操作,而無需更改 運行的元素的類別 。

+0

+1因爲鏈接...我讀過它們,我現在不打算使用它,但很高興知道 – nacho4d 2010-10-06 09:43:49

+0

@ nacho4d:太棒了。只是想讓你知道,如果你正確使用@ KennyTM的解決方案,你會不知不覺地使用命名空間原則。玩的開心! – Chubsdad 2010-10-07 06:17:19

相關問題