c++ pimpl惯用法

news/2025/3/16 22:18:06/

介绍

Pimpl(Pointer to implementation) 是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类(visible class)的实现细节(一般是所有私有的非虚成员)放在一个单独的实现类(implementation class)中,而在可见类中通过一个私有指针来间接访问该实现类。(如 std::unique_ptr

什么是 Pimpl 惯用法?

Pimpl 是 “Pointer to Implementation” 的缩写,将其打包成头文件和动态库的形式,交给第三方去使用,这个模式可以帮助我们:

  • 将接口和实现分离,实现信息隐藏
  • 减少头文件中的依赖
  • 实现库的平滑升级(实现文件有变动,只需要替换动态库即可)
  • 编译防火墙(只要头文件不变,第三方产品不需要重新进行编译的)
  • 加速编译

基本实现

基本的 Pimpl 实现需要一个前置声明的内部类和一个指向该内部类的指针。在这里,我们使用 std::unique_ptr 来管理这个内部类的实例。

MyClass.h

 #include <memory>class MyClassImpl; // 前置声明class MyClass {public:MyClass();~MyClass();void DoSomething();private:std::unique_ptr<MyClassImpl> pimpl;};

MyClass.cpp

 #include "MyClass.h"class MyClassImpl {public:void DoSomething() {// 实现细节}};MyClass::MyClass() : pimpl(std::make_unique<MyClassImpl>()) {}MyClass::~MyClass() = default;void MyClass::DoSomething() {pimpl->DoSomething();}

总结

通过使用 Pimpl 惯用法和智能指针,我们能更有效地隐藏实现细节,提高编译速度,并使代码更易于维护。


http://www.ppmy.cn/news/1373682.html

相关文章

【nodejs】“__dirname is not defined”错误修复

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 原理CommonJS vs ESM错误原因 2️⃣ 禁用 ESM 模式并改用 CommonJS方案一&#xff1a;项目方案二&#xff1a;单文件 3️⃣ 在 ESM 模式下自实现__dirname&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 从网上找了一份代码&am…

LT6813/ADBMS1818底层驱动---均衡控制

1、LT6813采用内部均衡的原理 2、平衡控制结构体 根据数据库中读取的控制值设置平衡。要为单元设置平衡&#xff0c;必须将相应的位写入配置寄存器中。LTC 驱动程序仅执行数据库中 BMS 写入的数据。 参数 ltc_stateLTC 状态机的状态pSpi接口指向 SPI 配置的指针pTxBuff &…

大数据开发(Hadoop面试真题-卷六)

大数据开发&#xff08;Hadoop面试真题&#xff09; 1、MapReduce为什么一定要有环型缓冲区&#xff1f;2、MapReduce为什么一定要有Shuffle过程&#xff1f;3、Reduce怎么知道去哪里拉Map结果集&#xff1f;4、MapReduce Shuffle的排序算法&#xff1f;5、MapReduce shuffle为…

c++虚函数的理解

在C中&#xff0c;虚函数是实现多态性的关键。多态性是指允许不同类型的对象对同一消息做出响应&#xff0c;也就是说&#xff0c;你可以用同一段代码对不同的对象进行操作。 虚函数是通过在基类中使用关键字virtual声明的成员函数。如果在派生类中重新定义基类中的虚函数&…

前端开发报错:Cannot find module ‘@angular-devkit/schematics‘ Require stack:

1、背景 由于近期需要搭建angular ng-zorro-mobile ionic 框架集成项目&#xff0c;但是在开发过程中遇到了报错&#xff1a; Cannot find module angular-devkit/schematics Require stack 2、原因 这里产生的原因是因为我当时遇到另外一个问题&#xff0c;误导我以为是版…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

vue3 对于watch的再次理解 给响应式变量赋相同值时watch不会被触发。

问题 当我给响应式变量赋相同值时watch不会被触发。 之前一直对于watch的理解是会被频繁触发&#xff0c;值变化就会被执行&#xff0c;反之computed会缓存相同值。 看官方文档也没有相关说明&#xff0c;加上赋相同值的场景占少数 结论 在 Vue 3 中&#xff0c;watch 函数默…

预约自习室

预约自习室 1、技术介绍 自习室预约系统的后端开发语言采用Node&#xff0c;后端开发框架采用Express&#xff0c;数据库采用的Node的最佳搭档MySQL。采用Vue作为前端开发框架&#xff0c;Element-UI作为开发的组件库&#xff0c;微信小程序。期间采用axios实现网页数据获取&a…