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美分.