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