2011-07-26 50 views
3

我在class.cppclass.h中定義了一個類。該類使用一些結構/類/類型/無論在stuff.h(當然還有stuff.cpp)中定義的私有成員和方法。我的主程序是main.cpp,其中#include s class.h,但並不關心stuff.h中的任何內容。如果它有所作爲,class.cp應該是動態加載的(.dll/.so)。
我理想上只想將stuff.h僅包含在class.cppstuff.cpp中,因爲它們只會導致main.cpp中的名稱空間污染,並且通過鏈接到最終程序而導致額外的膨脹。
問題是我必須在class.h中包含stuff.h,因爲它的定義用於我的課程的private:部分,全部在class.h。由於main.cpp帶來class.h,它也得到stuff.h在.h文件中包含僅用於私人數據的標頭

我希望這很清楚。在C#中,這可以通過部分類來解決。我將如何在C++中執行此操作?

+0

你擔心main.cpp中包含'stuff.h'的符號,還是實際的定義?含義 - 如果你只有'stuff.h'中的符號的前向聲明,它會在'main.cpp'中引起問題嗎? –

+0

@ eli-iser什麼是前向聲明? – baruch

+0

正如Soren和ks1322所描述的那樣 - 如果你有'class Stuff',你可以在'class.h'中使用它,而不用''include'ing'stuff.h'通過使用正向減速 - 'class Stuff;'。這將使'class.h'識別沒有'#include'的類'Stuff'。 –

回答

2

你在C++中使用pImpl aka Opaque Pointers來做到這一點,其中你公開的類只有一個屬性是一個部分定義的結構(有時候人們使用void *而不是相同的efefct)。

部分定義的結構,然後在stuff.cpp內部完全定義,一切都按照您的期望工作 - 唯一的障礙是您需要確保構造函數和析構函數new/delete內部實現,並且您需要在複製構造函數和賦值運算符中做出特殊規定operator= - 大多數人選擇僅使複製構造函數和賦值運算符爲私有的,以便編譯器在使用它們時會反對。

+0

你也可以用智能指針做pimpl,擺脫建造/銷燬私有實現的麻煩。 –

+0

@Marthinho,有趣的建議,你有一個可以參考的例子嗎? – Soren

+0

增強文檔中有一個示例:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/sp_techniques.html#pimpl(順便說一下,該頁面充滿了其他寶石。) –

0

看起來像你需要Pimpl Idiom在這裏。 Pimpl的主要思想是你用實現轉發聲明類而不是包含它的定義。這使您可以刪除頭文件中實現的依賴項,這通常會導致編譯速度加快,特別是在大型項目中。

相關問題