单例模式 :整个工程中,这个类永远只创建一个对象,无论调用多少次 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 条)
- 构造函数私有化 → 不能随便 new
- 禁用拷贝 / 赋值 → 不能复制
getInstance()返回静态实例 → 永远唯一
这就是工程最常用、最稳定的单例模式。