C++设计模式PIMPL模式

news/2024/11/15 1:51:08/

Pimpl是“Pointer to implementation”的缩写,它是一种常用的C++设计模式。这种模式的核心思想是将类的实现细节从其接口中分离出来。想象一下,我们生活的世界中充满了这种分离:我们不需要知道电视是如何工作的,只需要知道如何使用遥控器。同样地,Pimpl模式允许我们仅展示类的功能,而隐藏其内部工作方式

在C++中,头文件依赖是一个普遍的问题。当一个头文件改变时,所有包含这个头文件的源文件都需要重新编译。这可能导致编译时间显著增加,特别是在大型项目中。

考虑一个类,它包含了许多私有数据成员和复杂的实现。如果我们把所有这些都放在头文件中,那么任何小小的修改都会触发大量的重新编译。

Pimpl模式通过将实现细节移到源文件中,避免了这个问题,从而使得头文件变得轻量级和稳定。

//DeviceManager类
class DeviceManager {
public:DeviceManager() : d_pointer(std::make_unique<DeviceManagerPrivate>(*this)) {}void handleDeviceEvent(const std::string& event) {// 处理设备事件std::cout<<"event:"<<event<<"\n";}void log(const std::string& message) {// 记录日志std::cout<<"write to file"<<"\n";}private:std::unique_ptr<DeviceManagerPrivate> d_pointer;
};//DEviceManagerPrivate类
class DeviceManagerPrivate {
public:DeviceManagerPrivate(DeviceManager& p_instance): _p_instance(p_instance) {}void insertDevice(std::shared_ptr<Device> device) {std::lock_guard<std::mutex> lock(_device_map_mutex);_device_map[device->getId()] = device;_p_instance.handleDeviceEvent("Device inserted"); // 调用DeviceManager的方法}void removeDevice(uint32_t id) {std::lock_guard<std::mutex> lock(_device_map_mutex);_device_map.erase(id);_p_instance.handleDeviceEvent("Device removed"); // 调用DeviceManager的方法}private:DeviceManager& _p_instance;std::mutex _device_map_mutex;std::map<uint32_t, std::shared_ptr<Device>> _device_map;
};


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

相关文章

爱快路由的dns强制客户端代理真是个强大的功能

大致情况是这样的&#xff1a;同事说在linux服务器/etc/resolv.conf上随便写个IP地址【不在线的】&#xff0c;dns地址也能解析&#xff0c;让我帮忙查查。 我看了下也感觉纳闷&#xff0c;试了下不光在服务器上&#xff0c;我本地的pc随便设置了个dns解析也是一样的。 通过wir…

国科大作业考试资料-人工智能原理与算法-2024新编-第十二次作业整理

袋子里面有3个有偏差的硬币a、b和c,抛掷硬币正面朝上的概率分别是20%、60%和80%。从袋 子里随机取出一个硬币(3个硬币被取出的概率是相等的),并把取出的硬币抛掷3次,得到抛掷结 果依次是X1 , X2和 X3。 a. 画出对应的贝叶斯网络并定义必要的CPT表。 b. 如果抛掷结果是…

PHP接入consul,注册服务和发现服务【学习笔记】

PHP接入consul,注册服务和发现服务 consul安装 链接: consul安装 启动consul C:\Users\14684>consul agent -dev安装TP5 composer create-project topthink/think5.0.* tp5_pro --prefer-dist配置consul 创建tp5_pro/application/service/Consul.php <?php /*****…

PHP超级全局变量

PHP 中的超级全局变量&#xff08;Superglobals&#xff09;是 PHP 4.1.0 引入的一个特性&#xff0c;它们在脚本的全部作用域中都是可用的。这意味着一旦一个脚本被载入&#xff0c;这些变量就可以在脚本的任何地方被访问&#xff0c;无论是在函数内部还是外部。PHP 提供了几个…

日常踩坑---ljmp在BIOS中的使用

在 x86 架构&#xff0c;ljmp 指令用于执行远跳转&#xff0c;该指令的操作数是一个远指针&#xff0c;由一个16位的段选择器和一个16位的偏移量组成&#xff0c;因此实模式下ljmp 指令的字节码长度是5个字节。 1个字节&#xff1a;操作码&#xff08;opcode&#xff09;&…

ARM系列运行异常排查

一、断点指令BKPT BKPT指令产生软件断点中断&#xff0c;可用于程序的调试。它使处理器停止执行正常指令&#xff08;使处理器中止预取指&#xff09;而进入相应的调试程序。 BKPT指令的格式为&#xff1a;BKPT 16位的立即数 二、使用BKPT进行软件异常定位 假设异常发生后…

CentOS磁盘分区和挂载

记一次Linux上磁盘分区和挂载的日记。 #查看磁盘 [rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 600M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /b…

MySQL --- 表的操作

在对表进行操作时&#xff0c;需要先选定操作的表所在的数据库&#xff0c;即先执行 use 数据库名; 一、创建表 create table 表名( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a…