c++ - 使用 pimpl-idiom 创建库

标签 c++ pimpl-idiom

我正在尝试为将使用 pimpl-idiom 的库定义接口(interface)。下面是我定义的一个典型的接口(interface)类。

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

函数 func1()、func2() 是接口(interface)函数。而notif1()、notif2()是应用程序必须实现的通知函数(在A的子类中)。

这是为库定义接口(interface)的正确方法吗? 这种方法有什么缺点或者有更好的解决方案吗?


谢谢大家的回答。 因此,从我收集到的所有答案来看,以下是表示库接口(interface)的好方法。

// Forward declaration
class AImpl;

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

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

最佳答案

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

我认为这不是个好主意。

关于c++ - 使用 pimpl-idiom 创建库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065600/

相关文章:

c++ - 内存管理容器设计问题 - 项目需要继承

c++ - 使用复杂的显示功能会阻止 glutKeyboardFunc 工作

C++ const 正确性漏洞或意外使用?

c++ - Pimpl + QSharedPointer - 析构函数 = 灾难

c++ - 是否有任何理由不使用 pimpl 在 C++ 中实现 move 支持?

c++ - Pimpl、私有(private)类前向声明​​、范围解析运算符

c++ - 如何在不声明变量的情况下获取和使用常量值的地址?

c++ - 最优雅的方式来写一次 'if'

c++ - 为什么 adjacency_list<> 中 <> 为空

c++ - Pimpl 带有包含类的 header