淺談c++中的Pimpl
阿新 • • 發佈:2022-05-30
淺談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的實現更改,也不會影響到外部呼叫者。