用C++实现单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类在整个应用程序中仅有一个实例,并提供一个全局访问点来获取这个实例。这种模式常用于那些需要频繁创建且消耗资源较多的对象,或者需要控制对共享资源访问的场景,比如数据库连接池、线程池、配置管理器等。

特点

  1. 唯一性:确保一个类只有一个实例。
  2. 全局访问:提供一个全局访问点,让其他对象可以容易地访问到这个实例。
  3. 延迟初始化:通常直到第一次使用时才创建实例,即所谓的懒加载,以节省资源。

实现要点

  1. 私有构造函数:防止外部直接创建实例。
  2. 静态私有实例变量:存储唯一实例。
  3. 公有的静态访问方法:提供获取唯一实例的方法。

在C++中实现单例模式,可以采用多种方式,这里我将展示几种常见的实现方法,包括饿汉式、懒汉式(含双重检查锁定)、以及静态内部类方式(C++中没有直接的静态内部类,但可以通过命名空间或者嵌套类模拟)。请注意,C++11及以后版本提供了更强大的线程支持,因此在实现时可以利用原子操作等现代C++特性来确保线程安全性。

  1. 饿汉式
    饿汉式在类加载时就完成了初始化,线程安全且简单直接,但可能会提前占用资源。
class Singleton {
public:static Singleton& getInstance() {return instance;}private:Singleton() {} // 私有构造函数~Singleton() {} // 私有析构函数防止外部deleteSingleton(const Singleton&) = delete; // 禁止拷贝构造Singleton& operator=(const Singleton&) = delete; // 禁止赋值运算符static Singleton instance; // 静态实例
};// 初始化静态成员
Singleton Singleton::instance;
  1. 懒汉式 + 双重检查锁定
    懒汉式在首次使用时才初始化实例,双重检查锁定进一步优化了并发性能。
#include <mutex>class Singleton {
public:static Singleton& getInstance() {if (!instance_) {std::lock_guard<std::mutex> lock(mutex_);if (!instance_) {instance_ = new Singleton();}}return *instance_;}private:Singleton() {} // 私有构造函数~Singleton() {} // 私有析构函数Singleton(const Singleton&) = delete; // 禁止拷贝构造Singleton& operator=(const Singleton&)赋值运算符static Singleton = delete; // 禁止* instance_; // 静态指针实例static std::mutex mutex_; // 互斥锁
};// 初始化静态成员
Singleton* Singleton::instance_ = nullptr;
std::mutex Singleton::mutex_;
  1. 静态局部变量方式(模拟静态内部类)
    C++没有静态内部类的概念,但可以通过命名空间或者嵌套类加静态局部变量的方式模拟实现。
class Singleton {
public:static Singleton& getInstance() {return Nested::instance;}private:Singleton() {} // 私有构造函数~Singleton() {} // 私有析构函数Singleton(const Singleton&) = delete; // 禁止拷贝构造Singleton& operator=(const Singleton&) = delete; // 禁止赋值运算符class Nested {public:static Singleton instance;};friend class Nested;
};// 静态局部变量在第一次使用时初始化,且线程安全(C++11标准保证)
Singleton Singleton::Nested::instance;

以上展示了C++中实现单例模式的几种方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择最合适的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829646.shtml

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

相关文章

华为MRS服务使用记录

背景&#xff1a;公司的业务需求是使用华为的这一套成品来进行开发&#xff0c;使用中发现&#xff0c;这个产品跟原生的Hadoop的那一套的使用&#xff0c;还是有很大的区别的&#xff0c;现记录一下&#xff0c;避免以后忘了 一、原始代码的下载 下载地址&#xff1a;MRS样例…

UVa12313 A Tiny Raytracer

UVa12313 A Tiny Raytracer 题目链接题意分析AC 代码 题目链接 UVA - 12313 A Tiny Raytracer 题意 给出 《训练指南》题意翻译 本题的任务是实现一个小型光线追踪渲染器。场景由若干三角形网格&#xff08;triangle mesh&#xff09;组成&#xff0c;有且仅有一个点光源&…

R语言高级数据管理

一&#xff0c;数学函数 绝对值函数abs(x) sqrt(x) 开平方根 不小于某个数的最小整数ceiling(x) 不大于某个数的最大整数floor(x) 四舍五入round(x) sin(x) cos(x) log(x) 二&#xff0c;统计函数 求平均值 > x<-c(2,3,4,5,6,7,8,9,10) > mean(x) 求和 &g…

RustGUI学习(iced)之小部件(二):如何使用滑动条部件

前言 本专栏是学习Rust的GUI库iced的合集&#xff0c;将介绍iced涉及的各个小部件分别介绍&#xff0c;最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个&#xff0c;目前处于发展中&#xff08;即版本可能会改变&#xff09;&#xff0c;本专栏基于版本0.12.1. 概述…

抓包理解协议

用的Wireshark 抓包 1.抓包网卡选择 - WLAN 无线网卡&#xff0c;其他是本地虚拟机的网卡 这里分别是开始捕获、停止捕获、重新捕获、网卡选择&#xff0c;下面是可以过滤选择 过滤tcp包 3次握手&#xff1a; source是源地址&#xff0c; destination是目标地址&#xff0c;in…

QT文件上传带进度条实例(含源码)

一、Qt上传知识点 QNetworkAccessManager QNetworkAccessManager 是 Qt 中用于执行网络操作的类,它提供了一种方便的方式来发送网络请求并处理响应。以下是关于 QNetworkAccessManager 的一些重要知识点: 发送网络请求:QNetworkAccessManager 可以通过不同的方法发送网络请…

CSS3(响应式布局)

#过渡# 属性连写&#xff1a; transition: width 2s linear 1s; //前一个时间用于表示过渡效果持续时间&#xff0c;后一个时间用于表示过渡效果的延迟。 #转换# #2D转换# 和 #3D转换# 注意&#xff1a;其中angle对应单位为&#xff1a;deg #圆角# #边框# …

使用Docker部署Jupyter Notebook并结合花生壳的内网穿透实现远程访问(详文)

一、前言 本文主要介绍如何利用宝塔面板中的Docker 3.9.3管理器,使用Docker本地部署Jupyter Notebook,并结合花生壳内网穿透工具实现任意浏览器公网远程访问Jupyter登录界面。 安装完成后在宝塔面板中图例 Jupyter Notebook是一个交互式笔记本,支持运行40多种编程语言。…

会声会影2024破解电脑版下载附带永久免费激活码

会声会影2024是一款功能强大的视频编辑软件&#xff0c;它凭借直观易用的界面、全面的编辑工具以及丰富的特效和转场效果&#xff0c;受到了广大视频编辑爱好者和专业人士的喜爱。以下是对会声会影2024的详细介绍&#xff1a; 会声会影最新一键安装包下载如下&#xff1a; ht…

sqlserver在执行维护计划备份时报错,重新设置维护任务,也同样出错,另一计划的异地备份又正常。

出错提示&#xff1a;已以用户 NT Service\SQLSERVERAGENT 的身份执行。 最大值(1)&#xff0c;因此导致失败。当错误数达到 MaximumErrorCount 中指定的数目时将发生这种情况。请更改 MaximumErrorCount 或纠正这些错误。 警告结束 DTExec: 已返回包执行 DTSER_FAILURE (1)。…

PotatoPie 4.0 实验教程(23) —— FPGA实现摄像头图像伽马(Gamma)变换

为什么要进行Gamma校正 图像的 gamma 校正是一种图像处理技术&#xff0c;用于调整图像的亮度和对比度&#xff0c;让显示设备显示的亮度和对比度更符合人眼的感知。Gamma 校正主要用于修正显示设备的非线性响应&#xff0c;以及在图像处理中进行色彩校正和图像增强。 以前&am…

《从零开始的Java世界》11网络编程

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。 这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。 在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真…

冯唐成事心法笔记 —— 知己

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录卷首语 管理是一生的日常&#xff0c;成事是一生的修行PART 1 知己 用好自己的天赋如何管理自我第一&#xff0c;如何…

C++学习随笔(12)—— list

本章我们来了解一下list 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 1. list的介绍及使用 1.1 list的介绍…

【Unity常用插件】Dotween插件API详解【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

LabVIEW飞机机电系统综合测试平台

LabVIEW飞机机电系统综合测试平台 在现代航空领域&#xff0c;机电系统的准确性与可靠性对飞行安全至关重要。针对飞机机电管理计算机&#xff08;UMC&#xff09;复杂度增加、测试覆盖率低、效率不高等问题&#xff0c;开发了一套基于LabVIEW的机电系统综合测试平台。平台通过…

内网穿透及公网解析说明

内网穿透释义&#xff1a; 自己在本地搭建服务器时&#xff0c;本地网络有多种环境&#xff0c;如没有公网IP、没有路由映射权限、网络被NAT转发等情况。在需要外网访问内网服务器资源时&#xff0c;就需要用到内网穿透。内网穿透&#xff0c;即内网映射&#xff0c;内网IP地址…

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录&#xff08;2024/04/21&#xff09; 为什么要进行图像的二值化&#xff1f; 当我们处理图像时&#xff0c;常常需要将其转换为二值图像。这是因为在很多应用中&#xff0c;我们只对图像中的某些特定部分感兴趣&#xff0c;而不需要考虑所有像素的…

如何进行域名解析?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…