使用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;
}
接口库将实现接口功能,而应用程序将在派生类中实现通知功能。 有没有遵循这种模式的图书馆的好例子?     

解决方法

pimpl意味着您的类不再只能是标头。这意味着对于库的用户而言,仅包含#header头已不再足够,但他们还必须链接库的目标代码。 标头中类的运行时性能会稍慢一些,因为它需要为不透明成员的每次访问取消引用指针。作为交换,该成语使您可以更频繁地更改类的不透明成员。但这对于生产中的库来说并不是什么优势,因为那样无论如何它应该不会有太大变化。 我认为这不是一个好主意。     ,您不需要在结构A中声明AImpl类。 我通常会做一个前向声明:
//Forward Declaraion.
class AImpl;

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...