我發現自己我傾向於沒有私有類函數。如果可能的話,所有的私人類功能的候選人,而是我放入未命名的名稱空間,並傳遞所有必要的信息作爲函數參數。我沒有一個合理的解釋,爲什麼我這樣做,但至少對我來說看起來更自然。因此我需要在頭文件中公開更少的內部細節。私有類函數與未命名名稱空間中的函數
您的意見是什麼 - 這是正確的做法嗎?
我發現自己我傾向於沒有私有類函數。如果可能的話,所有的私人類功能的候選人,而是我放入未命名的名稱空間,並傳遞所有必要的信息作爲函數參數。我沒有一個合理的解釋,爲什麼我這樣做,但至少對我來說看起來更自然。因此我需要在頭文件中公開更少的內部細節。私有類函數與未命名名稱空間中的函數
您的意見是什麼 - 這是正確的做法嗎?
在我通常工作的半大型項目中(超過200萬行代碼),如果可以的話,我會禁止私人課程功能。原因是私有類的功能是私有的,但它在頭文件中是可見的。這意味着,如果我改變簽名(或評論),無論如何,我有時會得到一個完整的重新編譯,這個編譯需要幾分鐘的時間(或者幾個小時,取決於項目)。
只是說不,並隱藏什麼是私人的cpp文件。
如果我要開始新的大型c + +項目,我會強制PIMPL成語:http://c2.com/cgi/wiki?PimplIdiom移動更多的私人細節到cpp文件。
這不是100%的規則。匿名命名空間有一個巨大的缺點,就是無法爲其中的函數編寫UT。相比之下,完全重新編譯可以是微不足道的代價。 就我個人而言,我只是禁止匿名命名空間,並強制實現私有類功能的UT覆蓋範圍,至少對於不那麼穩定的項目來說。 – sankalpn 2016-10-28 19:14:29
我認爲這是一個很好的做法。它通常具有隱藏輔助結構和數據類型的好處,這減少了重建的頻率和大小。如果事實證明它們在其他地方很有用,它還使得這些功能更容易分解到另一個模塊中。
它基本上歸結爲這個函數是否真的作爲類的一部分有意義的問題。如果你唯一的意圖是保持課程的細節不在頭上,我會考慮使用pimpl習語。
我以前做過這件事,而且它總是很糟糕的結局。您不能將類對象傳遞給函數,因爲它們需要訪問私有成員,大概是通過引用(或者最終導致了錯綜複雜的參數列表),因此您無法調用公共類方法。出於同樣的原因,你不能調用虛函數。我堅信(根據經驗),這是一個糟糕的想法。底線:這聽起來像是一種可能在實現「模塊」對類有特殊訪問權的地方工作的想法,但在C++中並不是這樣。
你說得對,有時參數列表足夠大。這絕對是這種方法的缺點。另一方面,我試圖遠離使用任何虛函數,所以我很少會需要調用虛函數。無論如何感謝您的答案! – drumsta 2010-08-12 21:20:39
@kriau爲什麼遠離使用虛擬功能?你還沒有刪除你對頭文件的依賴。這讓我覺得你可能在這裏尋找的是PIMPL的成語。 – 2010-08-12 21:23:08
Pimpl的+1(儘管它不是原始答案的一部分) – 2010-08-13 06:53:11
我認爲這是一個非常棘手的問題(+1)。我認爲還是有一些有效的答案可以打開...... – Wolf 2014-09-02 09:38:46