Pimpl是Pointer to Implementation的缩写,是一种实现信息隐藏的技术(惯用法)。
也有一些词描述:private class data,compiler firewall,handle class等。
核心想法是:将类的实现细节放到一个独立的类中,然后在类的接口中只暴露一个指向这个类的指针。
// Widget.h
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
class WidgetImpl;
WidgetImpl* pImpl;
};
// Widget.cpp
#include "Widget.h"
class Widget::WidgetImpl {
public:
void doSomething() {
// Implementation here
}
};
Widget::Widget() : pImpl(new WidgetImpl) {}
Widget::~Widget() { delete pImpl; }
void Widget::doSomething() { pImpl->doSomething(); }
Widegt.h可以很简单,仅包含一些接口声明。
Widget.cpp还可以包含一些额外的include,这样也能避免循环依赖。
数据块也能包含在WidgetImpl中,对外只暴露接口。
参考:
- https://roadmap.sh/cpp找到Pimpl对应的章节。