2017-07-13 89 views
-1

熊在這裏。 我想弄清楚在什麼時候你會畫出關於在匿名與細節命名空間與私人與創建pimpl或朋友類中放置助手方法的界限。C++詳細命名空間vs匿名vs私人方法來上課vs pimpl vs.朋友類

這是我的要求..請讓我知道你的想法。

所以,如果我有 foo.hpp Foo.cpp中

,我有一些免費的功能bar不訪問任何數據成員foo,而且沒有客戶需要知道這些免費的功能,只foo.cpp的方法需要它們直接將它們放在foo.cpp中的匿名命名空間中,並完成它。

但是,如果bar需要訪問foo的數據成員,我們可以製作bar foo的私有方法。但這意味着即使foo的客戶端並不在意bar,但每次bar都會發生變化,因此我們需要重新編譯。

(這部分我有點模糊): 然而,至少使用一個詳細的命名空間在這種情況下,有助於foo.hpp的讀者不要打擾看着bar,因爲他們真的不需要知道。這是詳細命名空間約定的通用用例嗎?

現在,如果我們有一堆bar_1,bar_2 ... bar_n,它們有關聯在一起,他們需要訪問數據成員,我可以讓一個朋友類baz foo,並把bar s在那裏。

但是,如果我真的關心編譯時間並隱藏接口,我可以訴諸pimpl(在這部分中,再次非常模糊,通常如果我看到這一點,警鐘就會熄滅,並告訴我設計中的某些部分已關閉)。

你的想法...

+1

請勿用英文,郵政編碼描述代碼。 –

+1

***你的想法***我會繼續使用PIMPL。 https://herbsutter.com/gotw/_100/ – drescherjm

回答

1

正如有人評論較早,這將是更好的爲用戶提供如你所描述的概念,你的問題的代碼的一個例子是相當抽象和複雜的。

以下是我想要了解的更多內容:私有方法,私有實現,未命名的命名空間非成員函數,非命名空間中的非成員函數以及朋友非成員函數。

私有方法:首先,你將不得不宣佈這些在你的類聲明,他們的原型將是公開可見的,即使你在課堂之外沒有人可以調用它。這有點不合理。您應該在2種情況下使用這些方法:

  1. 您需要在實現此方法時訪問您的類的私有內容。
  2. 您正在使用NVI習語實現虛擬方法。

私有執行:您應該使用它來隱藏您的類的實現細節。 AKA的數據成員。我經常做的一件事是在我的類頭文件中轉發聲明我的pImpl類型,並在cpp文件中創建私有實現類的類朋友。

未命名的命名空間非成員函數:它們或多或少等同於在實現文件中使用static關鍵字聲明的非成員函數。你應該儘可能地拍攝那些人。一個好的經驗法則是,所有非虛擬的私有方法都應該作爲非朋友的,非成員函數來聲明爲未命名的命名空間。這樣做的好處是它會迫使你在實現這些功能時使用你的類的公共接口。一個重要的警告:永遠不要在頭文件中使用未命名的名稱空間。 (.h或.hpp)如果這樣做,那麼每次包含文件時,這些文件中的每個原型都將具有唯一的符號。這可能會導致符號混亂。

命名空間內的非成員非好友功能:大多數情況下,當您想要將服務添加到您的類或提供未綁定到類的輔助函數時,您將使用這些函數。這些函數的優點是它們只使用類的公共接口。很好地使用這些方法的一個很好的例子是當你爲你的類實現運算符時。 假設你有班級「A」和班級「B」。並且您想要將A的實例添加到B的實例。傳遞性規則說明您也可以將B添加到A,並獲得相同的結果。如果您創建了operator +非成員,則不必修改任何類來實現此功能。如果你把它作爲一種公共的方法來做,你將不得不在兩個課堂上都這樣做。如果您想了解更多關於該主題的信息,我會向您推薦Scott Meyers的「Effective C++」。

朋友非會員功能:你應該儘可能避免這些。原因是他們的實施依賴於你班級的私人細節。你爲什麼要讓他們成爲朋友?可以接受的是,一個類的私有實現細節可以在任何時候改變,這可能會破壞你的功能或者更糟糕:使其行爲與預期不同。

所以你有它,當你有虛擬方法來通過NVI語言聲明時,使用私有方法,把你的數據成員放在私有實現中,在你的實現文件中將所有非虛擬私有方法聲明在未命名的名稱空間下,儘可能地宣佈公共服務爲非會員非朋友功能,並且不使用任何朋友非會員功能。

+0

由於問題的抽象性,我發現很難提供代碼示例。我試圖找出不同的場景,其中一個設計在另一個設計上跳躍。這很好地放下來,並簡要地顯示了不同的用例。試圖找到更詳細的信息。以下內容會捕捉你的想法..? '非會員非朋友函數':'斯科特邁爾斯:非成員函數如何改進封裝,對於私有實現,PIMPL'草藥薩特:什麼是類? - 接口原理' – thassan

+0

對於非成員非朋友功能:我指的是Scott Meyers:有效C++第三版 - 第23項:「首選成員函數的非成員非朋友函數」。至於這個問題,我只是把我的看法告訴了這個問題。周圍有許多學校的思想,但這是經驗和時間教給我的最好方法。我在這裏解釋的是我教給我們的初級開發人員做的事情,對他們來說似乎工作得很好。我真的希望它能爲你做同樣的事情。 – plfoley