如何创建一个单例类 (Singleton)

单例模式整个工程中,这个类永远只创建一个对象,无论调用多少次 getInstance(),都返回同一个实例

我给你最标准、最安全、工程上通用的 C++ 单例实现,直接复制就能用。


一、最简完整单例类(推荐)

头文件 CConfigManager.h

cpp

运行

复制代码
#ifndef CONFIG_MANAGER_H
#define CONFIG_MANAGER_H

// 单例类:整个工程只有一个实例
class CConfigManager
{
public:
    // 🔥 核心:获取唯一实例(调用这个就够了)
    static CConfigManager& getInstance();

    // 👇 下面是你自己的成员变量(示例)
    int channel_count;
    int clock_rate;
    int section_count;
    int section_length;
    bool trigger_enabled;

private:
    // 1. 构造函数私有化 → 禁止外部直接创建对象
    CConfigManager();
    // 2. 禁用拷贝构造 + 赋值运算符 → 禁止复制
    CConfigManager(const CConfigManager&) = delete;
    CConfigManager& operator=(const CConfigManager&) = delete;
};

#endif

源文件 CConfigManager.cpp

cpp

运行

复制代码
#include "CConfigManager.h"

// 获取唯一实例
CConfigManager& CConfigManager::getInstance()
{
    // 静态局部变量:程序生命周期内只初始化一次
    static CConfigManager instance;
    return instance;
}

// 构造函数(私有化)
CConfigManager::CConfigManager()
{
    // 可以在这里做默认初始化
    channel_count = 0;
    clock_rate = 0;
}

二、怎么使用?(非常简单)

cpp

运行

复制代码
// 1. 获取唯一实例
CConfigManager& config = CConfigManager::getInstance();

// 2. 直接使用成员变量
config.channel_count = 4;
config.clock_rate = 10000;

// 3. 任何地方调用,都是同一个对象!
int channels = CConfigManager::getInstance().channel_count;

无论在哪个文件、哪个函数调用,都是同一个实例


三、为什么这样写?(关键原理)

1. 私有化构造函数

cpp

运行

复制代码
private:
    CConfigManager();
  • 外部不能写 CConfigManager cfg;
  • 禁止创建多个对象

2. 禁止拷贝和赋值

cpp

运行

复制代码
CConfigManager(const CConfigManager&) = delete;
CConfigManager& operator=(const CConfigManager&) = delete;
  • 防止别人复制单例,导致出现多个实例

3. static 保证唯一

cpp

运行

复制代码
static CConfigManager instance;
  • 静态局部变量 :程序运行期间只创建一次
  • 线程安全(C++11 及以上标准)

四、你原来代码里的用法

你原来的代码:

cpp

运行

复制代码
m_effectiveChannelCount = CConfigManager::getInstance().channel_count;

完全可以直接用我这个类!


五、总结(记住这 3 条)

  1. 构造函数私有化 → 不能随便 new
  2. 禁用拷贝 / 赋值 → 不能复制
  3. getInstance() 返回静态实例 → 永远唯一

这就是工程最常用、最稳定的单例模式

相关推荐
海浪仙人掌4 分钟前
应收账款分析如何操作?应收账款分析有哪些注意事项?
数据库·人工智能
东方佑5 分钟前
元可塑性循环单元(Meta-RU)与 GRU 的对比研究与混合设计
人工智能·深度学习·gru
Chester_19996 分钟前
CSP202312C.树上搜索
开发语言·数据结构·c++·蓝桥杯·stl
Elastic 中国社区官方博客8 分钟前
在 Elasticsearch 中回填时间序列数据:通过批量 API 加载数月的历史指标数据
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
LlmCraft|大模型工程实践9 分钟前
08 预训练语言模型:BERT 与 GPT
人工智能·深度学习·nlp
feasibility.14 分钟前
ABot-World-0:当一块 RTX 5090 能编织无限世界——交互式世界模型的高德解法
人工智能·aigc·视频·地图·具身智能·英伟达·世界模型
Figo_Cheung17 分钟前
Figo共振网络宇宙演化论(RNC) :从原初对称破缺到全息大和谐的演化路径研究
开发语言·php·量子计算
leoZ23118 分钟前
第 6 篇:SchemaForm 渲染器核心实现
前端·javascript·vue.js·人工智能·神经网络·机器学习·自然语言处理
故七月18 分钟前
优胜劣汰·动态赋能——锦邻创享OPC社区的考核管理与退出机制
大数据·人工智能
重生之我来学Python23 分钟前
Git-SVN 混合开发,从入门到精通!
开发语言·git·svn·github