浅谈c++中的Pimpl

什么是Pimpl?

Pimpl 意思为“具体实现的指针”(Pointer to Implementation),

它通过一个公有的成员指针,将类的实现细节进行暗藏,从而达到缩小依赖、暗藏实现的目标。

利用实例

1、如果有如下场景:

Project A援用了多个第三方库OSG来实现具体的性能。Project B援用了 A,这时候如果A减少了osg的依赖,B在应用A时就很难防止不应用到OSG,这样对于B又须要从新编译等等,十分麻烦。

2、解决办法:

利用类的前置申明 + 公有成员指针

3、具体实现:

ClassA.h 头文件

    #pragma once    class ClassAPrivate;    //公有类前置申明    class ClassA    {    public:        ClassA();        ~ClassA();        //测试        void testFun();    private:         //公有指针        ClassAPrivate* d_ptr;    };

ClassA.cpp 源文件

    #include "ClassA.h"    #include "ClassAPrivate.h"    ClassA::ClassA()        :d_ptr(new ClassAPrivate(this))      {    }    ClassA::~ClassA()    {    }    void ClassA::testFun()    {        d_ptr->testFun();       //函数用公有类实现    }

ClassAPrivate.h 公有类头文件

    #pragma once    #include "osg/Node"    class ClassA;       //私有类前置申明    class ClassAPrivate : public osg::Node    {    public:        ClassAPrivate(ClassA *qPtr);        ~ClassAPrivate();        void testFun();        ClassA* q_ptr;      //保留共有类指针,可能须要调用私有类函数    };

公有类源文件依据具体需要实现即可。

用这样公有指针的实现,内部调用ClassA,就不须要晓得osg/Node的存在,暗藏了实现细节,若ClassAPrivate的实现更改,也不会影响到内部调用者。