背景:
PIMPL Idiom (指向 IPLementation 的指针)是一种实现隐藏技术,其中公共(public)类包装了在公共(public)类所属的库之外无法看到的结构或类。
这对库的用户隐藏了内部实现细节和数据。
在实现这个习惯用法时,为什么要将公共(public)方法放在 pimpl 类而不是公共(public)类上,因为公共(public)类的方法实现将被编译到库中,而用户只有头文件?
为了说明,这段代码将 Purr()
实现放在了 impl 类上,并将其包装起来。
为什么不在公共(public)类上直接实现 Purr?
// header file:
class Cat {
private:
class CatImpl; // Not defined here
CatImpl *cat_; // Handle
public:
Cat(); // Constructor
~Cat(); // Destructor
// Other operations...
Purr();
};
// CPP file:
#include "cat.h"
class Cat::CatImpl {
Purr();
... // The actual implementation can be anything
};
Cat::Cat() {
cat_ = new CatImpl;
}
Cat::~Cat() {
delete cat_;
}
Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
printf("purrrrrr");
}
最佳答案
我认为大多数人将此称为 Handle Body 成语。参见 James Coplien 的书 Advanced C++ Programming Styles and Idioms 。它也被称为 Cheshire Cat因为Lewis Caroll's角色逐渐消失,直到只剩下笑容。
示例代码应分布在两组源文件中。那么只有 Cat.h 是产品附带的文件。
CatImpl.h 包含在 Cat.cpp 中,CatImpl.cpp 包含 CatImpl::Purr() 的实现。使用您的产品的公众不会看到此信息。
基本上,这个想法是尽可能地隐藏实现以防窥探。
这在您拥有作为一系列库提供的商业产品时最有用,这些库通过 API 进行访问,客户的代码是针对该 API 进行编译和链接的。
我们通过重写 IONA's 来做到这一点Orbix 2000年3.3产品。
正如其他人所提到的,使用他的技术将实现与对象的接口(interface)完全分离。然后,如果您只想更改 Purr() 的实现,则不必重新编译使用 Cat 的所有内容。
这种技术用于一种称为 design by contract 的方法中。 .
关于c++ - 为什么要使用 "PIMPL"成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60570/