2011-05-19 159 views
1

我正在嘗試爲將使用pimpl-idiom的庫定義接口。以下是我定義的典型接口類。使用pimpl-idiom創建庫

struct A { 
public: 
    void func1(); 
    void func2(); 
    virtual void notif1(); 
    virtual void notif2(); 
private: 
    class AImpl; 
    AImpl *impl; 
} 

函數func1(),func2()是接口函數。 notif1(),notif2()是應用程序必須實現的通知函數(在A的子類中)。

這是定義庫接口的正確方法嗎? 這種方法有什麼缺點,還是有更好的解決方案?


感謝您的所有答案。 因此,從所有的答案中我收集到,以下是代表圖書館界面的好方法。

// Forward declaration 
class AImpl; 

struct A { 
public: 
    void func1(); 
    void func2(); 
private: 
    virtual void notif1(); 
    virtual void notif2(); 
    AImpl *impl; 
} 

接口庫將實現接口函數,應用程序將在派生類中實現通知函數。 是否有任何遵循這種模式的圖書館的好例子?

+0

與pimpls無關(即,與您的實際問題),但公共虛擬功能是一個壞主意。 Herb Sutter在他的「Exceptional C++」系列叢書中多次詳細介紹了這一點。 – ildjarn 2011-05-19 23:36:19

回答

1

你不申報結構A.內部的AIMP1類

我一般做正向declaraion要求:

//Forward Declaraion. 
class AImpl; 

struct A { 
public: 
    void func1(); 
    void func2(); 
    virtual void notif1(); 
    virtual void notif2(); 
private: 
    AImpl *impl; 
} 
3
  • 平普爾意味着你的類可以不再僅郵件頭。這意味着對於庫的用戶來說,它不再足以包含頭文件,但它們也必須鏈接庫的目標代碼。
  • 頭中類的運行時性能會稍微慢一些,因爲它需要爲每個不透明成員的訪問取消引用指針。作爲交換,這個習語可以讓你更經常地改變班上不透明的成員。但對於一個生產圖書館來說,這並不是什麼好處,因爲它不應該改變太多。

我不認爲這是一個好主意。

+0

[這裏](http://stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface)是關於使用PIMPL vs聲明純虛擬類的好貼子 – user258808 2011-05-19 23:34:53