如何创建一个单例类 (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() 返回静态实例 → 永远唯一

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

相关推荐
tedcloud1233 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
jerryinwuhan5 小时前
基于各城市站点流量的复合功能比较
开发语言·php
曦月逸霜5 小时前
啥是RAG 它能干什么?
人工智能·python·机器学习
AI医影跨模态组学6 小时前
Lancet Digit Health(IF=24.1)广东省人民医院刘再毅&南方医科大学南方医院梁莉等团队:基于可解释深度学习模型预测胶质瘤分子改变
人工智能·深度学习·论文·医学·医学影像·影像组学
应用市场6 小时前
AI 编程助手三强争霸(2026 版):Claude、Gemini、GPT 各自擅长什么?
人工智能·gpt
UXbot6 小时前
AI原型设计工具如何支持团队协作与快速迭代
前端·交互·个人开发·ai编程·原型模式
AC赳赳老秦6 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
脑极体6 小时前
从Token消耗到DAA增长,AI价值标尺正在重构
人工智能·重构
迈巴赫车主6 小时前
Java基础:list、set、map一遍过
java·开发语言
csdn小瓯6 小时前
LangGraph自适应工作流路由机制:从关键词匹配到智能决策的完整实现
人工智能·fastapi·langgraph