当前位置: 首页 > news >正文

C++面向对象单例模式禁止拷贝、禁止赋值操作(=delete)

文章目录

    • 代码
    • 解读
      • 解释
      • 目的和优点

代码

// GPIOManager.h
#ifndef GPIOMANAGER_H
#define GPIOMANAGER_H#include <string>
#include <mutex>
#include <thread>
#include <chrono>
#include <atomic>class GPIOManager
{
public:static GPIOManager &getInstance();~GPIOManager();void setHigh();void setLow();int readValue();int setHighThenLow(int delaySeconds, std::string &errorMsg);private:GPIOManager(); // 构造函数私有化GPIOManager(const GPIOManager &) = delete;GPIOManager &operator=(const GPIOManager &) = delete;int gpioNumber = 438;            // GPIO 编号std::string gpioAlias = "PQ.03"; // GPIO 别名std::string basePath;std::string pinPath;std::mutex gpioMutex; // 互斥锁std::atomic<bool> isRunning; // 用于跟踪setHighThenLow是否正在执行void initialize(); // 私有方法void executeCommand(const std::string &cmd);
};#endif // GPIOMANAGER_H#if 0 // 使用方法
void someFunction() {auto& gpio = GPIOManager::getInstance();gpio.setHigh(); // 设置高电平gpio.setLow();  // 设置低电平
}
#endif

其中有:

private:GPIOManager(const GPIOManager &) = delete;GPIOManager &operator=(const GPIOManager &) = delete;

解读

GPIOManager.h头文件中,下面两行代码:

GPIOManager(const GPIOManager &) = delete;
GPIOManager &operator=(const GPIOManager &) = delete;

这些语句的作用是禁止拷贝和赋值操作对GPIOManager类的对象。这是一种常见的做法,特别是在设计单例模式的类时。

解释

  1. 禁止拷贝构造函数 (GPIOManager(const GPIOManager &) = delete):
    这行代码意味着你不能使用拷贝构造函数来创建一个GPIOManager的新实例,如下所示的操作是不允许的:

    GPIOManager a;
    GPIOManager b = a; // 编译错误,因为拷贝构造函数被删除
    
  2. 禁止赋值操作 (GPIOManager &operator=(const GPIOManager &) = delete):
    这行代码阻止了将一个GPIOManager对象赋值给另一个现有的对象。例如,以下操作将引发编译时错误:

    GPIOManager a;
    GPIOManager b;
    b = a; // 编译错误,因为赋值操作符被删除
    

目的和优点

  • 单例模式保护GPIOManager类设计为单例,这意味着整个程序的运行过程中只能有一个GPIOManager的实例。禁止拷贝和赋值是保护这一单例实例不被无意复制或替换的一种手段。
  • 避免资源复制问题:如果类管理如文件描述符或网络连接等外部资源,不当的拷贝可能导致资源管理混乱,如资源泄漏或意外的副作用(例如,两个对象试图关闭同一资源)。
  • 线程安全:在多线程环境中,意外的拷贝可能导致竞态条件或数据一致性问题。通过删除拷贝和赋值操作符,你可以减少这种风险。

总的来说,这种做法是对单例设计模式的一个强化,确保了类的全局控制和资源管理的安全性。

ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍
ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt 通过QSS设置两个QWidget的叠加
  • HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)
  • 会员注册表单包括先写基础信息,地址选择,上传文件,填写身份证号等功能JavaScript+HTML
  • LeetCode125. 验证回文串
  • android kotlin集成WorkManager实现定时获取数据
  • Linux软件编程学习第十三天
  • Redis远程字典服务器(4)—— string类型详解
  • 周记-2024年第32周8.5~8.11:北京出差,拒绝羞怯
  • 《大语言模型:原理与工程实践》大模型入门必读书籍,PDF版整理好了
  • Linux线程基础学习记录
  • 仅12%程序员担心被AI取代 62%开发者在使用AI工具
  • 贝莱德与摩根大通的最新季度持仓分析
  • 一个能减少重绘的属性?分享 1 段优质 CSS 代码片段!
  • html+css+js网页设计 作业歌帝梵官网首页1个页面6个js效果
  • C#中的多线程
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • angular2 简述
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • express如何解决request entity too large问题
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js作用域和this的理解
  • LeetCode18.四数之和 JavaScript
  • Next.js之基础概念(二)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React组件设计模式(一)
  • spring学习第二天
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue总结
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • ------- 计算机网络基础
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 我的业余项目总结
  • 一些css基础学习笔记
  • # 飞书APP集成平台-数字化落地
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (1)STL算法之遍历容器
  • (16)Reactor的测试——响应式Spring的道法术器
  • (175)FPGA门控时钟技术
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C++)八皇后问题
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm高校实验室 毕业设计 800008
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三) diretfbrc详解
  • (小白学Java)Java简介和基本配置
  • (一)80c52学习之旅-起始篇
  • (转)jdk与jre的区别
  • (转)jQuery 基础
  • (转)Oracle存储过程编写经验和优化措施