浅谈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的实现更改,也不会影响到外部调用者。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。