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