假设我有这样的课程(简化):
class Foo_p;
class Foo
{
private:
Foo_p *p;
public:
Foo();
/* methods, etc... */
};
此类是API的一部分。 Foo_p是该类的所有私有部分,而不是 像往常一样在类Foo中声明,而是在一个单独的前向声明的类中,该类仅由外部不可见的底层实现使用。
我已经看到过这个模式在几个项目中使用过,有没有它的名字?
另外,我如何正确使用它(例如异常安全等)?实际实施应该在哪里?在Foo类中,像往常一样,只使用Foo_p存储数据,或者在Foo_p类中使用Foo只是一个包装器?
答案 0 :(得分:8)
这是众所周知的PIMPL。私有/指向私有实现。类{em> 的类Foo_p
已经私有地实现,并通过指向它的指针访问,这样他们只能看到公共接口而不是向客户端显示真正的类。你选择暴露。它基本上从标题中抽象出protected
和private
成员中存在的实现细节的痕迹。
我发现它在VC ++中不实用 - 它破坏了代码完成。如果您非常确定您的实施并且不希望标题中显示private
和protected
成员,这将非常有用。
我将类Foo_p
的实际实现放在类Foo
的cpp文件中,虽然这可能是代码完成中断的原因,至少我不必运行通过包含其标题来重用该类的风险。
答案 1 :(得分:8)
这就是pimpl习语
见
答案 2 :(得分:2)
这是一个d指针,它是一种不透明指针。类似于PIMPL习语。
C ++类声明中常用的一种不透明指针是 d指针。 d指针是唯一的私有数据成员 class并指向struct的实例。由Arnt Gulbrandsen命名 对于Trolltech,此方法允许类声明省略private 数据成员,除了d指针本身。[6]结果是 更多的类实现是隐藏的视图,即添加新的 私有结构的数据成员不会影响二进制 兼容性,以及包含该类的头文件 声明只需#include所需的其他文件 类接口,而不是它的实现。作为一方 好处,编译速度更快,因为头文件变化较少 经常。 d指针在Qt和KDE库中大量使用。