1. 程式人生 > 其它 >淺談c++中的Pimpl

淺談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的實現更改,也不會影響到外部呼叫者。