背景资料:
PIMPL 成语是一种用于实现隐藏的技术,在这种技术中,公共类包装了一个结构或类,而这个结构或类在公共类所属的库之外是看不到的。
这对库的用户隐藏了内部实现细节和数据。
在实现这个习惯用法时,为什么要将公共方法放在 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");
}