前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

原创
作者头像
芯片烤电池
修改于 2022-04-28 02:07:04
修改于 2022-04-28 02:07:04
58200
代码可运行
举报
文章被收录于专栏:C++教程C++教程
运行总次数:0
代码可运行

什么是  Single Instance 单例模式?

单例模式是计算机程序设计当中一种常用思路,即软件系统运行当中,该类只允许拥有一个实例,且它必须在初始化的时候自己创建自己的实例。

那么单例模式主要是什么用途呢?

优化访问性能,便于进行数据共享。

比如说:

1,软件系统运行当中,业务上的配置文件参数共享。

2,多线程之间数据的共享。

3,调用类似于数据库操作这种需要频繁访问的对象时,减少 Object 的频繁创建销毁和函数调用的栈内存消耗。

4,数据需要临时保存时,给其他对象提供一个统一化的数据接口

5,提升高度复用情况下的访问性能。

那么单例模式的具体实现方式是?

创建一个类,这个类会自己创建自己在内存当中的实例,实例可以被其他类访问,同时不允许以任何方式再次创建这个类的实例。

其中有什么原则?

1,必须保证在整个软件系统运行的生命周期当中,实例仅有一个,不能被再次创建,也不能被拷贝、赋值。

2,必须保证内存的安全性问题。

3,必须保证线程的安全性问题。

4,必须保证实例仅能通过指定的接口获得。

那么具体有什么细节?

1,可以通过将 构造、拷贝构造、赋值运算符重载 声明为 Private 以保证实例不会被再次创建。

2,可以通过智能指针进行包装,以保证内存的安全性。

3,可以通过使用 Static 关键字保证实例指针常驻于内存全局变量区。

4,可以使用 std::call_once 来保证类的实例只会创建一次,并且不会有线程安全问题。

单例模式分为主动模式和被动模式,区别是:

主动模式在类加载时就已经创建好了自己的实例。

被动模式在被第一次调用时才会创建自己的实例。

这里演示的是被动模式:

================== 创建一个叫大脑工具箱的“工具类” ==================

----------------- 头文件 ----------------- 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once
#include <memory>
using std::shared_ptr;
using std::make_shared;

#include <mutex>
using std::call_once;
using std::once_flag;

// 创建一个叫大脑工具箱的单例类
class BrainToolBox
{
public:
    // 获取单例的函数
    static shared_ptr<BrainToolBox> GetInstance();

public:
    // 供调用的测试函数
    void HelloByte();

private:
    // Private 锁死构造和析构
    BrainToolBox();
    ~BrainToolBox();

    // Private 锁死拷贝构造
    BrainToolBox(const BrainToolBox&) {};

    // Private 锁死赋值运算符
    BrainToolBox& operator=(const BrainToolBox&) {};

private:
    // 单例的指针声明
    static shared_ptr<BrainToolBox> BrainInstance;

    // Onec Flag 声明
    static once_flag BrainOnceFlag;

};

----------------- CPP文件 ----------------- 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

#include "BrainToolBox.h"

// 单例的指针定义
shared_ptr<BrainToolBox> BrainToolBox::BrainInstance;

// OnceFlag 定义
once_flag BrainToolBox::BrainOnceFlag;

// 获取单例 如果不存在则创建且只创建一次
shared_ptr<BrainToolBox> BrainToolBox::GetInstance()
{
    call_once(BrainToolBox::BrainOnceFlag, [&] {
        struct make_shared_enabler : BrainToolBox{};
        BrainToolBox::BrainInstance = make_shared<make_shared_enabler>();
    });
    return BrainToolBox::BrainInstance;
}

// 测试输出一段字符串以确定单例类被成功创建
void BrainToolBox::HelloByte()
{
    std::cout << "Hello Byte!" << std::endl;
    return;
}

// 构造
BrainToolBox::BrainToolBox()
{

}

// 析构
BrainToolBox::~BrainToolBox()
{

}

================== 测试一下 ==================

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "BrainToolBox.h"

int main()
{
    shared_ptr<BrainToolBox> tool = BrainToolBox::GetInstance();
    tool->HelloByte();
 
}

会打印 Hello Byte 字符串。

====================================

芯片烤电池 C++ Example 2022-Spring Season Pass :

【Example】C++ 标准库常用容器全面概述

【Example】C++ 回调函数及 std::function 与 std::bind

【Example】C++ 运算符重载

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

【Example】C++ 接口(抽象类)概念讲解及例子演示

【Example】C++ 虚基类与虚继承 (菱形继承问题)

【Example】C++ Template (模板)概念讲解及编译避坑

【Example】C++ 标准库 std::thread 与 std::mutex

【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

【Example】C++ 标准库 std::condition_variable

【Example】C++ 用于编译时封装的 Pimpl 演示 (编译防火墙 Private-IMPL)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

====================================

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++单例模式的两种优化
在《more effective C++》中,作者曾在限制类所能生成对象的个数章节讨论过“允许产生0个或1个对象”,其实该部分讲解的方法就是单例模式。而单例模式的底层思路就是:禁止用户自己定义对象,通过定义方法给用户调用来生成对象。
程序员的园
2024/07/18
970
C++单例模式的两种优化
代码背后的哲思:C++特殊类实现的艺术与科学
C++ 是一门充满无限可能的语言,凭借其丰富的特性和灵活的抽象能力,使得开发者能够实现许多令人惊叹的功能。特殊类的设计与实现是 C++ 编程中的一项重要实践,它不仅考验开发者对语言特性的理解,更体现了对程序架构的设计思考。在这篇文章中,我们将深入探讨 C++ 特殊类实现的核心思路,从设计理念到代码技巧,带你走进 C++ 世界的奇妙殿堂。
suye
2024/12/20
1500
单例模式很简单?但是你真的能写对吗?
来源:https://segmentfault.com/a/1190000015950693
编程珠玑
2019/11/27
2.2K0
单例模式很简单?但是你真的能写对吗?
【C++】设计模式:建造者、原型、单例
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
DevFrank
2024/07/24
870
C++的三种单例模式—–深度解析
因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情形也不相同。今天要实现的是常用的三种,分别是饿汉式、懒汉式和多线程式。这个分类有点不准确,也可以说成 两类,懒汉式,饿汉式,然后要保证二者的线程安全。
全栈程序员站长
2022/09/01
2.7K0
C++ 单例模式
原理都是:把构造函数设置为私有,添加一个私有的静态成员指针变量,添加一个public getInstance方法获取指针来使用。
forxtz
2020/10/10
9410
C++ 单例模式_c 单例模式
本文对C++ 单例的常见写法进行了一个总结, 包括1>懒汉式版本、2>线程安全版本智能指针加锁、3>线程安全版本Magic Static; 按照从简单到复杂,最终回归简单的的方式循序渐进地介绍,并且对各种实现方法的局限进行了简单的阐述,大量用到了C++ 11的特性如智能指针,magic static,线程锁;从头到尾理解下来,对于学习和巩固C++语言特性还是很有帮助的。
全栈程序员站长
2022/11/17
9760
C++ 单例模式_c 单例模式
【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr
unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个unique_ptr,只可以被移动给另一个unique_ptr。unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用的情况是单例模式和编译防火墙的封装。
芯片烤电池
2022/04/27
1.1K0
C++ 实现单例模式的几种方法
在开发中,有时候会需要一些类在项目的生命周期中只有一个实例。这样的设计被称作单例模式。
Power
2025/04/01
1230
C++设计模式-单例模式讲解
在C++中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式对于管理资源、控制对共享资源的访问或者创建一些中心控制类非常有用例如相关配置管理器、日志记录器、数据库连接池等。
晨星成焰
2024/07/28
3160
C++设计模式-单例模式讲解
同步&异步日志系统:设计模式
设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路。它不是语法规定,⽽是⼀ 套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。
小陈在拼命
2024/12/28
960
同步&异步日志系统:设计模式
【C++进阶学习】第十四弹——特殊类设计——探寻各种情况下类的应用
在C++中,对象的创建位置(栈或堆)对于程序的性能和内存管理有着重要影响。栈上创建的对象通常生命周期短,而堆上创建的对象可以拥有更长的生命周期。下面我们就来详细探讨如何设计一个类,使其对象只能在堆上或栈上创建,以及这些设计选择背后的逻辑和实践。
GG Bond1
2024/08/29
1270
《C++并发编程实战》读书笔记(1):并发、线程管控
计算机系统中的并发包括任务切换与硬件并发,往往同时存在,关键因素是硬件支持的线程数。不论何种,本书谈论的技术都适用。
C语言与CPP编程
2023/08/10
4400
《C++并发编程实战》读书笔记(1):并发、线程管控
C++一分钟之-C++中的设计模式:单例模式
在软件工程中,设计模式是一种通用的解决方案,用于解决常见的设计问题。其中,单例模式确保一个类只有一个实例,并提供一个全局访问点。本文将深入浅出地介绍C++中的单例模式,包括其常见问题、易错点以及如何避免这些问题。
Jimaks
2024/07/13
8520
从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝 #include <iostream> using names
s1mba
2017/12/28
7690
从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
UNIX(多线程):11---单例设计模式共享数据分析,call_once()函数
单例设计模式 单例:整个项目中,有某个或者某些特殊的类,属于该类的对象 ,更多关于设计模式的内容可以在公众号的菜单栏里选择设计模式查看。 注意delete指针的技巧:类中套类,利用类对象回收时调用析构
用户3479834
2021/02/03
5430
UNIX(多线程):11---单例设计模式共享数据分析,call_once()函数
C++避坑指南
导语:如果,将编程语言比作武功秘籍,C++无异于《九阴真经》。《九阴真经》威力强大、博大精深,经中所载内功、轻功、拳、掌、腿、刀法、剑法、杖法、鞭法、指爪、点穴密技、疗伤法门、闭气神功、移魂大法等等,无所不包,C++亦如是。 C++跟《九阴真经》一样,如果使用不当,很容易落得跟周芷若、欧阳锋、梅超风等一样走火入魔。这篇文章总结了在学习C++过程中容易走火入魔的一些知识点。为了避免篇幅浪费,太常见的误区(如指针和数组、重载、覆盖、隐藏等)在本文没有列出,文中的知识点也没有前后依赖关系,各个知识点基本是互
腾讯技术工程官方号
2019/06/12
1.7K0
C++避坑指南
让类/进程/脚本「单身」的方法
有某些场景下,我们不希望有多个相同的 Linux 进程 或 Shell 脚本同时执行,因为相同进程同时执行,可能会破坏数据的一致性。
小林coding
2020/03/31
2.2K0
让类/进程/脚本「单身」的方法
【Linux】:日志策略 + 线程池(单例模式)
🔥 下面开始,我们结合我们之前所做的所有封装,进行一个线程池的设计。在写之前,我们要做如下准备
IsLand1314
2024/12/20
920
【Linux】:日志策略 + 线程池(单例模式)
【Example】C++ Template (模板)概念讲解及编译避坑
C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。
芯片烤电池
2022/04/27
8620
推荐阅读
相关推荐
C++单例模式的两种优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验