C++设计模式PIMPL模式

news2024/9/7 16:20:57

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.coloradmin.cn/o/1952534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2020 CSP第一题:数字拆分

2020 CSP第一题&#xff1a;数字拆分 示例1 输入 6 输出 4 2 题意&#xff1a; 实质就是将一个偶数转化为二进制数&#xff0c;然后分别用十进制逆序输出每一项 数据约束&#xff1a; n最大在10的七次方左右&#xff0c;int类型够了&#xff0c;十进制转化为二进制后&#x…

重生之“我打数据结构,真的假的?”--3.栈和队列

1.栈和队列的基本概念 1.1 栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则…

鸿蒙开发——axios封装请求、拦截器

描述&#xff1a;接口用的是PHP&#xff0c;框架TP5 源码地址 链接&#xff1a;https://pan.quark.cn/s/a610610ca406 提取码&#xff1a;rbYX 请求登录 HttpUtil HttpApi 使用方法

开源模型应用落地-LangChain实用小技巧-ChatPromptTemplate的partial方法(一)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 二、术语 2.1.LangChain 是一个全方…

TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题

目录 TCP/IP协议介绍 协议是什么,有什么作用? 网络协议为什么要分层 TCP/IP五层网络协议每层的作用 应⽤层 DNS的作用及原理 DNS工作流程 数据链路层 以太⽹帧格式 MAC地址的作用 ARP协议的作⽤ ARP协议的工作流程 MTU以及MTU对 IP / UD / TCP 协议的影响 传输层…

MySQL(持续更新中)

第01章_数据库概述 1. 数据库与数据库管理系统 1.1 数据库相关概念 DB&#xff1a;数据库&#xff08;Database&#xff09;即存储数据的“仓库”&#xff0c;其本质是一个文件系统。它保存了一系列有组织的数据DBMS&#xff1a;数据库管理系统&#xff08;Database Manageme…

2024年【广东省安全员B证第四批(项目负责人)】考试报名及广东省安全员B证第四批(项目负责人)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试报名根据新广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员B证第四批&#x…

AFast and Accurate Dependency Parser using Neural Networks论文笔记

基本信息 作者D Chendoi发表时间2014期刊EMNLP网址https://emnlp2014.org/papers/pdf/EMNLP2014082.pdf 研究背景 1. What’s known 既往研究已证实 传统的dp方法依存句法分析特征向量稀疏&#xff0c;特征向量泛化能力差&#xff0c;特征计算消耗大&#xff0c;并且是人工构…

UE5 with plugins AirSim in Windows ROS in WSL2-Ubuntu 20.04配置过程记录

一、概述 因为需要使用到Windows系统下的UE5和插件AirSIm进行研究&#xff0c;所以在Windows环境下进行配置。但又因为需要使用到ros进行操作&#xff0c;所以&#xff0c;在通过对诸多资源进行考察过后&#xff0c;因为UE5plugins AirSim已经配置成功。只需要考虑跟ROS的通信以…

构建查询洞察 UI

本文字数&#xff1a;2631&#xff1b;估计阅读时间&#xff1a;7 分钟 作者&#xff1a;Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现&#xff0c;为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…

CSS 两种盒模型 box-sizing content-box 和 border-box

文章目录 Intro谨记box-sizing 两个不同赋值的效果区别&#xff1f;宽高的数值计算标准盒模型 box-sizing: content-box; box-sizing 属性的全局设置 Intro 先问一句&#xff1a;box-sizing 和它的两个属性值是做什么用的&#xff1f;以前我并不知道它的存在&#xff0c;也做…

GeneCompass:跨物种大模型用于破解基因调控机理

GeneCompass是第一个基于知识的跨物种基础模型&#xff0c;该模型预先训练了来自人类和小鼠的超过1.2亿个单细胞转录组。在预训练过程中&#xff0c;GeneCompass有效整合了四种生物先验知识&#xff0c;以自监督的方式增强了对基因调控机制的理解。对多个下游任务进行微调&…

SSM酒店信息管理系统-计算机毕业设计源码41731

摘要 酒店信息管理系统是一种基于计算机技术的管理工具&#xff0c;旨在提高酒店业务效率和服务质量。该系统通过集成多个功能模块&#xff0c;实现酒店各项业务的自动化管理&#xff0c;包括客房信息管理、预订信息管理、入住信息管理、退房信息管理、续费信息管理等。该系统可…

免费使用正版的Typora教程

1.来到Typora官网下载安装。 Typora官网: https://typoraio.cn/ 2.激活主程序 编辑修改Typora安装目录下文件 下面展示文件目录路径 &#xff1a; D:\SoftWare\Typora1.9.5\resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.js查找&#xff1a;e.hasAc…

打通“链上数据脉络” 欧科云链数字生态建设成果凸显

7月25日&#xff0c;据Coindesk报道&#xff0c;全球领先的区块链技术和服务提供商欧科云链宣布旗下OKLink浏览器与Polygon Labs正式达成合作&#xff0c;成为AggLayer首个区块链搜索引擎及Web3数据分析平台&#xff0c;将为开发者提供精简易用的链上数据访问和开发工具&#x…

Python 中的正反斜杠用法详解

在Python编程中&#xff0c;字符串是一个常用的数据类型&#xff0c;字符串中的斜杠&#xff08;反斜杠\和正斜杠/&#xff09;具有特殊的用法和意义&#xff0c;本文将介绍这两种斜杠的用法。 一、反斜杠的转义作用 在Python中&#xff0c;反斜杠&#xff08;\&#xff09;…

2024年必读高质量计算机编程书籍

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 1、推荐书籍&#xff1a;《Python Cookbook》 理由&#xff1a;这本书是Python学习者公认的经典教程&#xff0c;由资深Python专家David Beazley编写。它不仅仅是一本Python语言的参考手册&am…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中&#xff0c;React 是一个非常流行的框架&#xff0c;用…

科学又省力 宠物浮毛怎么去掉便捷高效?除毛秘籍养宠空气净化器

上次和朋友逛完街去她家&#xff0c;她家的猫哈基米一开门就飞奔过来&#xff0c;朋友直接抱起它狂亲。结果&#xff0c;猫毛和汗水粘得到处都是&#xff0c;手臂上、脸上都是&#xff0c;看得我这鼻炎星人直起鸡皮疙瘩。很多养宠物的朋友都说&#xff0c;天天给猫狗梳毛&#…

C++-----多态

一.对多态的解释 场景&#xff1a;买车票时&#xff0c;学生是半价&#xff0c;军人要优先......,对于不同的人群&#xff0c;在同一个售票窗口会受到不同折扣&#xff0c;这就是多态的体现。 上图就是多态的效果。 为什么Ticket的参数是person类型&#xff0c;但却能接受不同…