千家信息网

C++程序的Pimpl机制怎么实现

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,今天小编给大家分享一下C++程序的Pimpl机制怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
千家信息网最后更新 2025年01月20日C++程序的Pimpl机制怎么实现

今天小编给大家分享一下C++程序的Pimpl机制怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Pimpl机制是Private Implementation的缩写,我们常常听到诸如"不要改动你的公有接口"这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这会是个麻烦事儿。Pimpl机制,顾名思义,将实现私有化,力图使得头文件对改变不透明。

机制分析

首先,我们先看看不使用这个机制的一个实现:

// MyBase.h  class MyBase {  public:  int foo();  };  // MyDerived.h  #include "MyBase.h"  class MyDerived : public MyBase {  public:  int bar();  };

假设你现在希望在MyBase.h中加入一个新的private和protected成员函数,那么MyDerived和所有包含MyBase.h的源文件都需要重新编译。在一个大工程中,这样的修改可能导致重新编译时间的激增。你可以使用Doxygen或者SciTools看看头文件依赖。

一般来说,不在头文件中包含头文件是一个比较好的习惯,但是这也不能完全消除修改MyBase.h带来的重新编译代价。有没有一个机制可以使得对私有接口做修改时我们可以减小重新编译的代价。

在Pimpl机制中,我们使用前置声明一个Impl类,并将这个类的一个指针实例放入主类中,如下:

// MyClass.h  class MyClassImpl; // forward declaration  class MyClass {  public:  MyClass();  ~MyClass();  int foo();  private:  MyClassImpl *m_pImpl;  };

现在,除非我们修改MyClass的公有接口,否则这个头文件是不会被修改了。然后,我们用这个Impl类的实现来完成主类的细节实现,在主类的构造函数中,我们完成了实现类指针的实例化:

// MyClass.cpp  class MyClassImpl {  public:  int foo() {  return bar();  }  int bar() { return var++; }  int var;  };  MyClass::MyClass() : m_pImpl(new MyClassImpl){}  MyClass::~MyClass()  {  try {  delete m_pImpl;  }  catch (...) {}  }  int MyClass::foo(){ return m_pImpl->foo(); }

Pimpl机制其实这是桥接模式的一种变种。我们可以对实现类随意的进行增删和修改,而不会导致包含MyClass.h的源代码重新编译。当然,这样做的时间开销和空间开销也是有的。

在实践中,我们常常采用内部类来完成Pimpl机制:

// header  class fruit  {  public:   private:  class impl;  impl* pimpl_;  }   // implementation  class fruit::impl  {   };   fruit::fruit()  {  pimpl_ = new impl();  }

以上就是"C++程序的Pimpl机制怎么实现"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

机制 文件 编译 接口 知识 篇文章 私有 程序 C++ 代价 内容 函数 实例 开销 指针 时间 源文件 不同 很大 顾名思义 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 荆门哪里有软件开发方案 山东蓝狐网络技术有... 用友互联网科技有限公司 宁河软件开发哪家性价比高 公安局网络安全宣传主题 数据库语言设计图书管理系统 时间同步服务器地址 数据库按学号前四位求班级分组 我的世界服务器水突然不流了 枣庄医院网络安全 中铁隧道局在贵阳建数据库项目 拼多多影响国家网络安全 做网络安全有哪些方式 软件开发属于无形资产哪种 武汉千年网络技术公司 妈妈好江苏网络技术有限公司 怎么在表格中删除一列数据库 地质数据库建设委托业务 网络安全保护岗位 易语言写入数据库有空格 淘鹏服务器厂家 服务器沙雕 优质的文件服务器租用公司 网络安全与应急管理工作 静态网页数据库怎么连接 农批物业管理软件开发多少钱 网络安全演讲征文 手机怎么管理服务器数据库 域服务器软件分发 华为鲲鹏服务器供应厂家
0