使用pimpl-idiom创建库

时间:2011-05-19 22:35:50

标签: c++ 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;
}

接口库将实现接口函数,应用程序将在派生类中实现通知函数。 是否有一个遵循这种模式的库的好例子?

2 个答案:

答案 0 :(得分:3)

  • pimpl意味着您的课程不再仅限于标题。这意味着对于库的用户而言#include你的标题已经不够了,但它们也必须链接到库的目标代码。
  • 标头中类的运行时性能会稍微慢一些,因为它需要为不透明成员的每次访问取消引用指针。作为交换,这个习语允许你更频繁地改变班级的不透明成员。但对于生产中的图书馆而言,这并不是一个优势,因为无论如何它都不应该有太大变化。

我认为这不是一个好主意。

答案 1 :(得分:1)

您不需要在struct A中声明AImpl类。

我通常会做前瞻声明:

//Forward Declaraion.
class AImpl;

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