1

我正在尝试为将使用 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;
}

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

4

2 回答 2

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

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

于 2011-05-19T23:15:05.250 回答
1

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

我通常会做一个前向声明:

//Forward Declaraion.
class AImpl;

struct A {
public:
   void func1();
   void func2();
   virtual void notif1();
   virtual void notif2();
private:
   AImpl *impl;
}
于 2011-05-19T23:14:54.673 回答