2014-10-09 67 views
0

我有一個類(比如說MyClass)和以MyClass的實例作爲參數的函數。 這些函數需要訪問MyClass的私有成員。 成員是私人的,因爲MyClass的用戶不需要了解成員。 但是,我不想製作MyClass的函數成員,因爲函數應該將幾個MyClass實例作爲參數,並且對稱處理這些爭論。我不想專門處理「這個」對象。只有靜態成員函數的朋友類作爲C++中的朋友模塊?

如果有一種模塊系統,所以我可以聲明一個包含函數作爲MyClass的朋友的模塊,我會很高興。但是C++中沒有這樣的東西。 一種方法是創建一個朋友類並使該類的功能成爲靜態成員。然而,很多人不推薦這種方式(例如Namespace + functions versus static methods on a class),因爲班級不打算用於這種用途。

這種情況下的任何設計解決方案?

回答

1

namespace是當前相關的功能。但是不可能獲得一個朋友名稱空間,沒有更多的是可以模擬一個名稱空間或傳遞一個名稱空間作爲模板參數,兩種常見情況是隻有靜態成員的結構通常用作工作區。所以有一個很好的使用結構的先例。至少有另一個理由使用一個靜態成員的結構而不是一個名稱空間:一個名字空間在一個結構關閉的情況下可以添加。僅僅這個方面也可以作爲使用結構而不是朋友的命名空間的理由。

0

朋友不一定非得上課。你可以聲明一個函數是一個朋友。

+2

是的,我知道。然而,作爲朋友宣佈17個功能(並且數量可能增加)似乎不是一個美麗的解決方案。 – strugi 2014-10-09 15:13:54

+0

@strugi你真的有17種不同的東西,它們唯一的共性就是它們都將一個或多個'MyClass'實例作爲輸入?如果是這樣,並且如果它們中的任何一個都不能使用MyClass應該呈現的公共接口,那麼我認爲17個朋友函數是您設計的邏輯結果,並且在聲明它們時有意義(在該約束內)。 (有或沒有朋友聲明,我覺得這17個功能的想法有點令人不安。) – 2014-10-09 23:01:11

1

您通常實現諸如目標類成員的獨立函數之類的函數。你可以在課堂上「直接」實施它們,但它們仍然是獨立的。所以當你把所有這些功能列爲朋友+實現它們時,你不需要重複自己:

class MyClass { 
    int x; 

    friend void doSomething(MyClass & obj) { 
     obj.x++; 
    } 
    friend bool doSomethingDifferent(MyClass & a, MyClass & b) { 
     return a.x < b.x; 
    } 
}; 
+0

哇!我不知道這樣的語法存在。非常感謝你! – strugi 2014-10-09 15:19:50

+1

我做了一些實驗。看來我必須對這些功能進行單獨的聲明。如果我不這樣做,只有參數相關的查找可以調用函數。 (http://stackoverflow.com/questions/8207633/whats-the-scope-of-inline-friend-functions)。 – strugi 2014-10-09 16:29:29

+0

好的,我不知道命名空間問題。但在你的情況下ADL不是很好嗎?我的意思是,你會用一些'MyClass'對象作爲參數來調用它,所以ADL應該完美地工作......它什麼時候失敗? – leemes 2014-10-09 21:27:55