C++笔记之单例模式

news2024/12/27 17:01:32

C++笔记之单例模式

在这里插入图片描述

前言

当一个类在程序的整个生命周期中,只需要一个实例的时候,就可以考虑把这个类设计成单例的方式,提供出去,让全局访问。一般来说比较 “重” 的一些类会设计成单例,比如像“引擎”, “xx池”,“xx系统”之类的。

实现方式一(推荐)

Singleton.h

#pragma once
class Singleton {
 private:
  Singleton(/* args */);
  Singleton(const Singleton &) = default;
  Singleton &operator=(const Singleton &) = default;

 public:
  ~Singleton();
  static Singleton &GetInstance();

  void doSomething();
};

Singleton.cpp

#include "Singleton.h"

#include <iostream>
using namespace std;
Singleton::Singleton() { cout << "Singleton constructor!!" << endl; }

Singleton::~Singleton() { cout << "Singleton destructor!!" << endl; }

Singleton& Singleton::GetInstance() {
  static Singleton sInstance;
  return sInstance;
}

void Singleton::doSomething() { cout << "Singleton::doSomething!!" << endl; }

Main.cpp

#include <iostream>

#include "Singleton.h"
using namespace std;
int main(int argc, char **argv) {
  cout << "hello world!" << endl;
  Singleton::GetInstance().doSomething();
  return 0;
}

执行结果:

hello world!
Singleton constructor!!
Singleton::doSomething!!
Singleton destructor!!

利用局部静态变量特性,线程安全,懒加载


实现方式二

利用智能指针和锁实现的double check单例模式

Singleton.h

#pragma once
#include <mutex>
class Singleton {
 private:
  Singleton(/* args */);
  Singleton(const Singleton &) = default;
  Singleton &operator=(const Singleton &) = default;

 private:
  static std::mutex sMutex;
  static std::shared_ptr<Singleton> sInstance;

 public:
  ~Singleton();
  static std::shared_ptr<Singleton> GetInstance();

  void doSomething();
};

Singleton.cpp

#include "Singleton.h"

#include <iostream>
using namespace std;

std::mutex Singleton::sMutex;
std::shared_ptr<Singleton> Singleton::sInstance = nullptr;

Singleton::Singleton() { cout << "Singleton constructor!!" << endl; }

Singleton::~Singleton() { cout << "Singleton destructor!!" << endl; }

std::shared_ptr<Singleton> Singleton::GetInstance() {
  if (sInstance == nullptr) {
    std::lock_guard<std::mutex> lock(sMutex);
    if (sInstance == nullptr) {
      sInstance = std::make_shared<Singleton>();///注释一
    }
  }
  return sInstance;
}

void Singleton::doSomething() { cout << "Singleton::doSomething!!" << endl; }

这里注意一下,注释一部分的代码,不可以使用std::make_shared<>的方式创建智能指针,会出现下面的错误。

需要改成:

sInstance = std::shared_ptr<Singleton>(new Singleton());

除此之外,这里在选择智能指针的时候,最好选择shared_ptr,而不是unique_ptr,因为unique_ptr 无法进行复制构造和赋值操作,它的拷贝构造函数和赋值构造函数被删除了。

执行结果:

hello world!
Singleton constructor!!
Singleton::doSomething!!
Singleton destructor!!


link

https://www.cnblogs.com/sunchaothu/p/10389842.html

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

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

相关文章

微搭低代码从入门到精通12-网格布局

开发小程序首要的就是考虑布局的问题&#xff0c;我们在以前的版本只能选择普通容器结合图片和文本组件来构建页面。 使用通用组件布局也可以&#xff0c;但有个问题是你要先学习CSS&#xff0c;要懂布局的概念&#xff0c;比如需要知道啥是flex布局&#xff0c;然后还得熟悉每…

分布式事务 | 使用DTM 的Saga 模式

DTM 简介前面章节提及的MassTransit、dotnetcore/CAP都提供了分布式事务的处理能力&#xff0c;但也仅局限于Saga和本地消息表模式的实现。那有没有一个独立的分布式事务解决方案&#xff0c;涵盖多种分布式事务处理模式&#xff0c;如Saga、TCC、XA模式等。有&#xff0c;目前…

【AI数学】相机成像之内参数

计算机视觉偏底层的工作会跟摄像机打交道&#xff0c;最近正好有接触&#xff0c;所以整理总结一下。 相机参数通常分为内参数、外参数&#xff0c;偶尔会有畸变参数等滤镜参数。 申明&#xff1a;本文图例均为原创&#xff0c;借用需附此文链接。 内参数&#xff1a;相机内部的…

[SSD固态硬盘技术 15] FTL映射表的神秘面纱

为什么需要映射表?固态硬盘的存储器件采用的是闪存[5],具有以下几个特点: (1)读写基本单位是以页(Page)为单位,擦除是以块(Block)为单位。

NFC概述摘要

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 原理来说,NFC和Wi-Fi类似,利用无线射频技术来实现设备间通信。NFC的工作频率为13.5…

基于c语言实现的对代码的同源性检测

完整代码&#xff1a;https://download.csdn.net/download/qq_38735017/87382389本次课程设计为了巩固上学期在软件安全课程上所学的安全知识&#xff0c;包括堆栈溢出、整数溢出等等&#xff0c;同时考察了一些课外的新事物&#xff0c;例如字符串匹配与CFG控制流程图的同源性…

Attention机制 学习笔记

学习自https://easyai.tech/ai-definition/attention/ Attention本质 Attention&#xff08;注意力&#xff09;机制如果浅层的理解&#xff0c;跟他的名字非常匹配。他的核心逻辑就是“从关注全部到关注重点”。 比如我们人在看图片时&#xff0c;对图片的不同地方的注意力…

为什么要在电子产品中使用光耦合器?

介绍 光耦合器不仅可以保护敏感电路&#xff0c;还可以使工程师设计各种硬件应用。光耦合器通过保护元件&#xff0c;可以避免更换元件的大量成本。然而&#xff0c;光耦合器比保险丝更复杂。光耦合器还可以通过光耦合器连接和断开两个电路&#xff0c;从而方便地控制两个电路…

【Markdown】markdown语法规定

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Vue3 如何实现一个函数式右键菜单(ContextMenus)

前言: 最近在公司 PC 端的项目中使用到了右键出现菜单选项这样的一个工作需求&#xff0c;并且自己现在也在实现一个偶然迸发的 idea&#xff08; 想用前端实现一个 windows 系统从开机到桌面的 UI&#xff09;&#xff0c;其中也要用到右键弹出菜单这样的一个功能&#xff0c;…

通讯录文件操作化

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

几个chatGPT的难题,关于语言转换

不同语言代码的移植一直以来是程序员面临的难题&#xff0c;最近问了问chatGPT能否解决这个问题。编写一个程序&#xff0c;实现c语言函数转换为php函数答&#xff1a;这是一个非常困难的问题&#xff0c;因为两种语言的语法、结构和标准库都不相同。如果您希望完成这个任务&am…

MySql服务多版本之间的切换

从网上总结的经验&#xff0c;然后根据自己所遇到的问题合并记录一下&#xff0c;方便日后再次需要用到 MySql服务多版本同时运行 步骤 1、如果你电脑上已经有一个mysql版本&#xff0c;例如mysql-5.7.39-winx64&#xff0c;它占据了3306端口。此时如果你想下仔另一版本&…

活动星投票紫砂新青年制作一个投票活动

“紫砂新青年”网络评选投票_免费链接投票_作品投票通道_扫码投票怎样进行现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥…

6年自动化测试,终于进华为了,年薪25w其实也并非触不可及

我的职业生涯开始和大多数测试人一样&#xff0c;开始接触都是纯功能界面测试&#xff0c;第一份测试工作就是在电商公司做功能测试&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好几年发现自己还只是一个功能测试工程师&#xff0…

锐捷(十四)mpls vxn optionc的关键问题所在和具体问题分析

用锐捷的设备搭建mpls vxn optionc的基础版和带RR的版本&#xff0c;在控制平面和转发平免上分析mpls vxn optionc的关键问题所在和具体问题分析。一 基础mpls vxn optionc&#xff1a;核心&#xff1a;两pe之间之间建立MP EBGP邻居&#xff0c;从而直接传递路由解放了ASBR。关…

LeetCode-1223-掷骰子模拟

1、动态规划法 我们可以利用数组dp[i][j][k]dp[i][j][k]dp[i][j][k]来表示当我们已经投过iii次骰子&#xff0c;其中第iii次投出的骰子是jjj&#xff0c;此时连续投出骰子jjj的次数为kkk。因此我们可以根据上一轮中得到的状态dp[i−1][j][k]dp[i-1][j][k]dp[i−1][j][k]&#…

最小二乘支持向量机”在学习偏微分方程 (PDE) 解方面的应用(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本代码说明了“最小二乘支持向量机”在学习偏微分方程 &#xff08;PDE&#xff09; 解方面的应用。提供了一个示例&#xff0c…

加盟管理系统挑选法则,看完不怕被坑!

经营服装连锁店铺究竟有多难&#xff1f;小编已经不止一次听到身边的老板&#xff0c;抱怨加盟连锁店铺难以管理了&#xff0c;但同时呢&#xff0c;也听到了很多作为加盟商的老板&#xff0c;抱怨总部给的支持和管理不到位。服装加盟店铺管理&#xff0c;到底有哪些难点呢&…

BFS广度优先遍历——Acwing 844. 走迷宫

1.BFS简介我们可以将bfs当做一个成熟稳重的人&#xff0c;一个眼观六路耳听八方的人&#xff0c;他每次搜索都是一层层的搜索&#xff0c;从第一层扩散到最后一层&#xff0c;BFS可以用来解决最短路问题。2.基本思想从初始状态S开始&#xff0c;利用规则&#xff0c;生成所有可…