Pimpl - 指针实现惯用法

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中,对外只暴露接口。

参考: