C++单例模式的设计

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在C++中,单例模式通常用于管理全局资源或共享状态。

以下是C++中实现单例模式的几种常见方式:

  1. 懒汉式(Lazy Initialization)
    懒汉式单例在第一次使用时才创建实例。

非线程安全版本:

class Singleton {
public:static Singleton& getInstance() {if (!instance) {instance = new Singleton();}return *instance;}// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}  // 私有构造函数~Singleton() {} // 私有析构函数static Singleton* instance; // 静态实例指针
};Singleton* Singleton::instance = nullptr; // 初始化静态成员

线程安全版本(使用双重检查锁定):

#include <mutex>class Singleton {
public:static Singleton& getInstance() {if (!instance) {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new Singleton();}}return *instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}static Singleton* instance;static std::mutex mutex;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
  1. 饿汉式(Eager Initialization)
    饿汉式单例在程序启动时即创建实例,线程安全。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 静态局部变量,程序启动时初始化return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};
  1. Meyer’s Singleton(静态局部变量)
    这是C++中最简洁的单例实现方式,利用了静态局部变量的特性(线程安全且懒加载)。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 静态局部变量,线程安全且懒加载return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};

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

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

相关文章

HBASE学习(一)

1.HBASE基础架构&#xff0c; 1.1 参考&#xff1a; HBase集群架构与读写优化&#xff1a;理解核心机制与性能提升-CSDN博客 1.2问题&#xff1a; 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录&#xff0c;比如写、删除。而memstor中存储的是写入…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …

【Rust练习】28.use and pub

练习题来自&#xff1a;https://practice-zh.course.rs/crate-module/use-pub.html 1 使用 use 可以将两个同名类型引入到当前作用域中&#xff0c;但是别忘了 as 关键字. use std::fmt::Result; use std::io::Result;fn main() {}利用as可以将重名的内容取别名&#xff1a;…

Nginx 可观测性最佳实践

Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器&#xff0c;也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型&#xff0c;使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性&#xff0c;在处理静…

《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维护与修理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维护与修理》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国汽车维修行业协会 …

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…

洛谷P4868 Preprefix sum

洛谷传送门 题目描述 前缀和&#xff08;prefix sum&#xff09;&#x1d446;&#x1d456;。 前前缀和&#xff08;preprefix sum&#xff09;则把 &#x1d446;&#x1d456; 作为原序列再进行前缀和。记再次求得前缀和第 &#x1d456; 个是 &#x1d446;&#x1d446…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中&#xff0c;凸函数 和 凸优化 是优化问题中的重要概念&#xff0c;许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数&#xff1f; 数学定义 一个函数 f…

vue3使用vue-native-websocket-vue3通讯

vue3使用vue-native-websocket-vue3通讯 插件使用一、启用Vuex集成1.在mian.js中2.store/index.js文件中3.要websocket使用的页面 二、启用Piain集成1.在mian.js中2.根目录下创建store文件夹&#xff0c;分别创建PiniaType.ts&#xff0c;store.ts&#xff0c;useSocketStore.t…

Windows图形界面(GUI)-QT-C/C++ - Qt控件与布局系统详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt布局系统(Layouts) 布局管理器基础 高级布局技巧 嵌套布局 设置间距和边距 常用控件详解 按钮类控件 QPushButton (标准按钮) QRadioButton (单选按钮) QCheckBox (复选框) …

深入理解 ECMAScript 2024 新特性:字符串 isWellFormed 方法

ECMAScript 2024 引入了一个新的字符串实例方法&#xff1a;String.prototype.isWellFormed。这一新增功能是为了帮助开发者更容易地验证字符串是否为有效的 Unicode 文本。本文将详细介绍这一方法的使用场景、实现原理及其在实际应用中的价值。 String.prototype.isWellFormed…

[Linux]Docker快速上手操作教程

前言 以下命令并不是docker的所有&#xff0c;仅涉及日常使用时最最常用的命令。 目的之一时给入门的朋友熟悉学习&#xff0c;其二时我自己偶尔使用时备忘。 一、概念 简单介绍下docker的相关概念&#xff1a; 镜像&#xff1a;Docker 镜像是一个轻量级、可执行的独立软件…

【算法学习笔记】32:筛法求解欧拉函数

上节学习的是求一个数 n n n的欧拉函数&#xff0c;因为用的试除法&#xff0c;所以时间复杂度是 O ( n ) O(\sqrt{n}) O(n ​)&#xff0c;如果要求 m m m个数的欧拉函数&#xff0c;那么就会花 O ( m n ) O(m \sqrt{n}) O(mn ​)的时间。如果是求连续一批数的欧拉函数&#x…

生产管理看板助力节能科技公司实现数据自动化管理

在节能科技公司的生产过程中&#xff0c;数据管理的自动化是提高生产效率和产品质量的关键。然而&#xff0c;许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点&#xff0c;如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时&#xff0c;以及…

leetcode 115. 不同的子序列

题目&#xff1a;115. 不同的子序列 - 力扣&#xff08;LeetCode&#xff09; 动态规划问题&#xff0c;f[i][j]表示s的第i个元素匹配到t的第j个元素&#xff0c;有多少种结果 f[i][j] f[i - 1][j] (s[i] t[j] ? f[i - 1][j - 1] : 0) 答案就是 f[s.length() - 1][t.len…

【C++】B2112 石头剪子布

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述游戏规则&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;解题分析与实现 &#x1f4af;我的做法实现逻辑优点与不足 &#x1f4af…

内存快照:宕机后Redis如何实现快速恢复?

文章目录 给哪些内存数据做快照&#xff1f;快照时数据能修改吗?可以每秒做一次快照吗&#xff1f;小结每课一问 更多redis相关知识 上节课&#xff0c;我们学习了 Redis 避免数据丢失的 AOF 方法。这个方法的好处&#xff0c;是每次执行只需要记录操作命令&#xff0c;需要持…

系统架构设计师考点—项目管理

一、备考指南 项目管理主要考查的是进度管理、软件配置管理、质量管理、风险管理等相关知识&#xff0c;近几年都没有考查过&#xff0c;但是有可能在案例分析中考查关键路径的技术问题&#xff0c;考生了解为主。 二、重点考点 1、项目的十大管理&#xff08;速记&#xff1…

iOS - Objective-C 底层实现中的哈希表

1. 关联对象存储&#xff08;AssociationsHashMap&#xff09; // 关联对象的哈希表实现 typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap; typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMa…

两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库

目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的&#xff0c;所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意&#xff1a;直接git pu…