C++中基于宏或模板的单例模式实现方案(参考Qt实现)
基于Qt风格的C++单例实现方案
参考Qt的单例设计思路后,我整理出两种可行的实现方式,先给大家分享第一种模板化通用单例的实现:
template <typename T> class Singleton { friend T; public: static T& instance(); private: Singleton() = default; ~Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; }; template <typename T> T& Singleton<T>::instance() { static T inst; return inst; } // 示例子类使用 class SingletonTest : public Singleton<SingletonTest> { // 可在此添加子类专属的成员与方法 friend class Singleton<SingletonTest>; private: SingletonTest() = default; // 私有构造,确保实例只能通过instance()获取 };
关键细节说明:
friend T:让子类能访问基类的私有构造函数——单例的核心是限制实例创建渠道,子类构造必须私有,基类通过友元授权才能完成子类实例的初始化。- 局部静态变量
static T inst:C++11及以后标准保证局部静态变量的初始化是线程安全的,既实现了懒加载(第一次调用instance()才初始化),又规避了多线程环境下的竞态问题。 - 删除拷贝构造与赋值运算符:通过
delete关键字禁用复制、赋值操作,从语法层面确保全局只会存在一个实例。
使用时直接通过子类的静态方法获取实例即可:
SingletonTest& testInst = SingletonTest::instance();
内容的提问来源于stack exchange,提问作者JustWe
相关产品推荐
相关产品推荐

