背景资料:
The PIMPL 习语(指向 IMPLementation 的指针)是一种实现隐藏技术,其中公共类包装了在公共类所属的库外部无法看到的结构或类。
这对库的用户隐藏了内部实现细节和数据。
在实现这个习惯用法时,为什么要将公共方法放在 pimpl 类上而不是公共类上,因为公共类方法实现将被编译到库中并且用户只有头文件?
为了说明这一点,这段代码将Purr()
impl 类的实现并包装它。
为什么不直接在公共类上实现 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");
}
我认为大多数人将其称为手柄本体成语。参见詹姆斯·科普林的书高级 C++ 编程风格和习惯用法。它也被称为柴郡猫因为刘易斯·卡罗尔的角色逐渐消失,直到只剩下笑容。
示例代码应分布在两组源文件中。那么只有Cat.h是产品附带的文件。
CatImpl.h包含在Cat.cpp and CatImpl.cpp包含实现CatImpl::咕噜声()。使用您的产品的公众不会看到这一点。
基本上,这个想法是尽可能隐藏实施过程,以免被窥探。
当您拥有作为一系列库提供的商业产品时,这非常有用,这些库可通过 API 进行访问,客户的代码将根据该 API 进行编译和链接。
我们通过重写来做到这一点IONA's Orbix3.3 2000年产品。
正如其他人所提到的,使用他的技术将实现与对象的接口完全解耦。然后你就不必重新编译所有使用的东西Cat如果你只是想改变的实现Purr().
该技术用于称为按合同设计.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)