乐趣区

关于c++:浅谈c中的Pimpl

浅谈 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 的实现更改,也不会影响到内部调用者。

退出移动版