pimpl班的私人会员?

Ann*_*nne 5 c++ pimpl-idiom

pimpl习语中使用的实现类是否有任何理由可以拥有任何私有成员?我真正想到的唯一原因是保护自己免受自己的伤害 - 即私人成员用于在类和用户之间强制执行某种契约,在这种情况下,类和用户是密切相关的,所以它似乎没必要.

Emi*_*ier 11

我认为人们将Pimpl 习语与适配器/桥接/策略模式混淆.习语是一种语言特有的.模式可以应用于多种语言.

Pimpl习惯用法是为解决C++中的以下问题而设计的:类的私有成员在类声明中是可见的,这会向类的用户添加不必要的#include依赖项.这个成语也称为编译器防火墙.

如果实现直接写在外部类的相应*.cpp文件中,并且在模块外部不可访问,那么我认为将它简单地用于Pimpl类的结构是完全正确的.为了进一步强化实现不是要直接重用的想法,我将它们定义为私有内部结构:

// foo.h
class Foo : boost::noncopyable
{
public:
   ...

private:
   struct Impl;
   boost::scoped_ptr<Impl> impl_;
};

// foo.cpp
struct Foo::Impl
{
   // Impl method and member definitions
};

// Foo method definitions
Run Code Online (Sandbox Code Playgroud)

一旦有实现类的头文件,我想我们不再谈论Pimpl习语.我们宁愿谈论适配器,桥接,策略,接口类等......

只需2美分.


Nem*_*vic 6

取决于你的pImpl实现 - 特别是你强制执行类不变量的地方,但总的来说,我认为impl部分不需要有protected/private成员.实际上,我通常将其声明为结构体.