C++设计模式 单例模式

server/2024/10/18 10:12:07/

单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。下面是一个使用 C++11 特性编写的线程安全的单例模式示例:

#include <iostream>
#include <mutex> // For thread safety
#include <memory>class Singleton {
public:static Singleton& getInstance() {std::call_once(initInstanceFlag, &Singleton::initSingleton);return *instance;}void doSomething() {std::cout << "Doing something useful.\n";}public:// Prevent move constructor and move assignment operator from being usedSingleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) = delete;Singleton() {} // Constructor is privatestatic void initSingleton() {instance = std::make_unique<Singleton>();}// Disable copy constructor and assignment operatorSingleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:static std::unique_ptr<Singleton> instance;static std::once_flag initInstanceFlag;};// Initialize static members
std::unique_ptr<Singleton> Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;int main() {Singleton& s = Singleton::getInstance();s.doSomething();return 0;
}

在这个例子中:

  • getInstance() 是一个静态成员函数,用于获取 Singleton 类的唯一实例。它使用了 std::call_once 来确保只初始化一次,并且在多线程环境下是安全的。
  • doSomething() 是一个示例功能函数。
  • 使用了 std::unique_ptr 来管理单例对象的生命周期,这样可以自动释放内存,防止内存泄漏。
  • 删除了拷贝构造函数、赋值运算符以及移动构造函数和移动赋值运算符来禁止复制或移动单例对象。

http://www.ppmy.cn/server/132740.html

相关文章

【Nuvoton干货分享】开发应用篇 5 -- 32bit MCU Flash 操作

在实际开发中&#xff0c;我们都会碰到需要把部分数据存放在不易失存储空间上&#xff0c;比如外部NOR FLASH、EEPROM、SD等存储空间上&#xff0c;针对数据量不大的情况下&#xff0c;可以考虑将数据存放在芯片ROM存储空间。Nuvoton 32bit MCU ROM存储空间包括LDROM、APROM、S…

深入理解WPF中的命令机制

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础&#xff0c;具有强大的图形和媒体处理能力。在WPF中&#xff0c;“命令”是一个重要的概念&#xff0c;它为应用程序开发…

关于FFmpeg【使用方法、常见问题、解决方案等】

1、提取音频 【1】提取无损高质量音频文件 问题描述 想要从视频文件中提取出无损高质量音频文件。 解决方案 ffmpeg -i input.mp4 -vn -c:a pcm_s16le -ar 44100 -ac 2 output.wav

5G 技术对智能交通系统有哪些潜在的影响?

5G技术对智能交通系统&#xff08;ITS&#xff09;的潜在影响是多方面的&#xff0c;包括但不限于以下几个关键领域&#xff1a; 车联网与自动驾驶&#xff1a;5G技术通过其高速率、低时延和高可靠性&#xff0c;极大地促进了车联网&#xff08;V2X&#xff09;技术的发展。这包…

网络爬虫-Python网络爬虫和C#网络爬虫

爬虫是一种从互联网抓取数据信息的自动化程序&#xff0c;通过 HTTP 协议向网站发送请求&#xff0c;获取网页内容&#xff0c;并通过分析网页内容来抓取和存储网页数据。爬虫可以在抓取过程中进行各种异常处理、错误重试等操作&#xff0c;确保爬取持续高效地运行 1、Python网…

Javascript算法——双指针法移除元素、数组去重、比较含退格字符、有序数组平方

数组移除元素&#xff08;保证数组仍连续&#xff09; 暴力求解法&#xff08;两层for循环&#xff09;,length单词拼写错误❌二次嵌套for的length设置 /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let leng…

数据结构-排序算法

基于交换的排序算法 快速排序&#xff1a; 最优情况 最优情况下&#xff0c;每次找到的参考轴把数据分成均匀的两半&#xff0c;最后应该是一个平衡二叉树状态&#xff1b;二叉树的层数&#xff08;logn&#xff09;即为递归需要进行的次数&#xff0c;并且每轮递归结束时&…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板&#xff0c;当页面没有指定 Layout 时&#xff0c;会自动调用此默认模板‌&#xff0c;如果要取消 在当页面设定 &#xff08;如下&#xff09;&#xff0c;则表示 当前页面…