2017-11-10 156 views
1

我正在構建某種神經網絡庫。由於我以前從未建立過任何圖書館,因此我對這種風格有一些疑問。
在我的項目有,例如以下類別:限制函數名稱空間

NeuralNetwork, Layer, Util 

都在同一個命名空間。現在,LayerUtil需要有一些公共職能,因爲他們將在NeuralNetwork中被調用。但是因爲NeuralNetwork是唯一可以訪問「世界其他地方」的類(並且順便說一句,創建一個單一的Layer對象沒有任何意義)。

那麼有什麼辦法可以在那個名字空間的其他類中使用這些函數嗎?還是有更優雅的方法?我想擴展這個類,只做私有函數,但這沒有任何意義,並且會使代碼更醜,因爲主類不是從其他類派生出來的,而是利用它們。

+1

瞭解生產質量圖書館做什麼的最好方法是檢查它們。 – StoryTeller

+0

即使是你應該解決的問題,我也在談論什麼?或者你只是和它一起生活,並希望沒有人會考慮用它做出奇怪的事情。 – po0l

+2

@ po0l:如果你在'Util.h'中定義'Util',並且你只在'NeuralNetwork.cpp'中使用'Util.h',而不是'NeuralNetwork.h',你不需要分發'Util.h '給你的用戶。即使你提供了整個源代碼,只將公共頭文件放入'include /'並將實現內部頭文件保存在'src /'中也是很常見的。 – MSalters

回答

0

這聽起來像你正在尋找匿名命名空間。我承認,有點怪異的名字。

基本上,在下面的代碼,foo提供給.cpp文件的其餘部分:

namespace { 
    class Foo { public: Foo(int) {} } ; 
} 

在幕後,編譯器將創建一個唯一的名稱,一些無法與衝突任何其他命名空間 - 甚至不是其他庫的匿名命名空間!你不關心那個隱藏的名字。在你的.cpp文件中,你可以直接使用Foo

+0

並且整個庫必須位於一個.cpp文件中? –

+1

@KjellGunnar:不,但請注意庫中的每個.cpp文件都有其自己的匿名命名空間。 – MSalters