共计 865 个字符,预计需要花费 3 分钟才能阅读完成。
浅谈 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 的实现更改,也不会影响到内部调用者。
正文完