2008-10-15 37 views
5

我的程序中的一個類使用了一些第三方庫。圖書館的對象是我的類的私有成員:C++頭文件 - 接口和實現細節之間的分離

// My.h 
    #include <3pheader.h> 

    class My 
    { 
    ... 
    private: 
     3pObject m_object; 
    } 

與此問題 - 在我的程序其他單位使用我的類應該被配置爲包括3P頭。移動到另一種3p將危及整個構建...我看到了兩種方法來解決這個問題 - 一個是使3pObject extern並將m_Object轉換爲指針,在構造函數中初始化;第二是創建一個「界面」和「工廠」類,並將它們導出...

你能否提出另一種解決方法?

回答

11

使用 「平普爾」 成語:

// header 
class My 
{ 
    class impl; 
    std::auto_ptr<impl> _impl; 
}; 

// cpp 
#include <3pheader.h> 
class My::impl 
{ 
    3pObject _object; 
}; 
+0

任何不使用boost :: scoped_ptr的原因? – grigy 2008-10-15 07:02:17

13

私有實現(PIMPL)模式:

http://www.codeproject.com/KB/tips/PIMPL.aspx

基本上,你定義一個類具有指向一個struct,你向前聲明。然後,在cpp文件中定義結構,並使用類中的構造函數和析構函數創建/刪除PIMPL。

:)

0

所有QT內部結構採用私有實現類來完成。
您可以查看它是如何正確完成的。