2012-01-31 49 views
11

假设我有这样的(简化的)类:这是什么设计模式?如何使用它?

class Foo_p; 
class Foo 
{ 
private: 
    Foo_p *p; 
public: 
    Foo(); 
    /* methods, etc... */ 
}; 

这个类是API的一部分。 Foo_p是类的所有私有部分,它们不是像往常一样在类Foo中声明的 ,而是在一个单独的前向声明类中,仅在底层实现中使用,而外部不可见。

我见过这个模式用于几个项目中,有没有一个名称?

另外,如何正确使用它(例如安全等例外)?实际执行到哪里去?在类Foo中,像往常一样,只使用Foo_p存储数据,或者在Foo_p类中使用Foo作为包装器?

回答

8

这就是众所周知的PIMPL。私有/指向私有实现。这个类Foo_p,你的类已经被私人实现并且通过指向它的指针被访问,所以它们只能看到你选择公开的公共接口,而不是向客户端显示真实的类。它实质上抽象了protectedprivate成员中实现细节的痕迹。我发现在VC++中它很笨拙 - 它破坏了代码的完成。如果您非常确定您的实施并且不希望privateprotected成员显示在标题中,这将非常有用。

我把类Foo_p的实际实现放在类Foo的cpp文件中,尽管这可能是导致代码完成中断的原因,至少我不必冒这个类被重用的风险包括其标题。

+0

请勿将头和普通防护级别(公/私)“基本上隐藏实现”? – 2012-01-31 20:31:07

+0

@Matthew:不幸的是,没有。你必须包含实现头文件,当他们依赖于例如Windows头文件时,这些头文件通常会很不舒服,这些头文件很糟糕。 – Puppy 2012-01-31 22:41:56

+0

@MatthewFlaschen:是的,但只是在您无法访问它的意义上,但您在查看代码时仍然可以*看到它。 – bitmask 2012-01-31 22:42:39

8
+0

感谢您的链接! – kralyk 2012-01-31 20:37:41

+0

链接已死: – pmb 2013-06-18 15:00:59

+1

@ pmb感谢您的提示,修复了所有三个链接_o.O固定链接...当他们工作时,他们非常nice_ :( – sehe 2013-06-19 09:38:47

2

这是一个d型指针,它是一种不透明指针。类似于PIMPL的成语。

C++类声明中常用的一种不透明指针类型是 d指针。 d指针是 类中唯一的私有数据成员,并指向结构的一个实例。由Trolltech的Arnt Gulbrandsen 命名,该方法允许类声明省略专用 数据成员,除了d指针本身。[6]结果是 更多的类的实现隐藏在视图中,向私有结构添加新的 数据成员不会影响二进制 兼容性,并且包含类 声明的头文件只需要#包括类接口所需的那些其他文件,而不是其实现。作为一个方面 的好处,编译速度更快,因为头文件经常更改较少 。 d指针在Qt和KDE库中大量使用。

https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B

+0

引用您的来源。 – 2012-01-31 20:33:25