2011-05-19 54 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