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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值