C++单例模式

简介: C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
#pragma once

namespace utility
{
    // 需要拼接一下命名空间 utility
#define SINGLETON(x) (friend class utility::##Singleton<x>);

    template <typename T>
    class Singleton
    {
    public:
        static T* instance()
        {
            if (m_instance == nullptr)
            {
                m_instance = new T();
            }
            return m_instance;
        }
    private:
        Singleton(){}
        Singleton(const Singleton<T>&);
        Singleton<T>& operator = (const Singleton<T>&);
        ~Singleton(){}
    private:
        static T* m_instance;
    };

    template <typename T>
    T* Singleton<T>::m_instance = nullptr;
}
AI 代码解读
#pragma once
#include "Singleton.h"
#include <iostream>
#include <string>

class A
{
    // 声明为友元类Singleton才能创建A的实例
    // friend class utility::Singleton<A>;
    SINGLETON(A);
public:
    void show()
    {
        std::cout << __FUNCTION__ << m_name << std::endl;
    }
private:
    A() : m_name(" name"){}
    A(const A&);
    A& operator = (const A&);
    ~A(){}
private:
    std::string m_name;
};
AI 代码解读
#include "A.h"
#include "Singleton.h"
using namespace utility;

int main()
{
    //1. 类A构造为私有(无法在模板单例类中创建instance实例)使用友元类解决
    //2. 对于多线程可能创建多个实例的问题(在主线程中先创建规避掉那种情况即可)
    Singleton<A>::instance();

    A* instanceA1 = Singleton<A>::instance();
    A* instanceA2 = Singleton<A>::instance();

    std::cout << "A1: " << instanceA1 << std::endl;
    std::cout << "A2: " << instanceA2 << std::endl;

    instanceA1->show();
    instanceA2->show();

    getchar();
    return 0;
}
AI 代码解读
目录
打赏
0
2
2
1
25
分享
相关文章
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
186 0
|
11月前
|
C++
C++实现单例模式-多种方式比较
单例模式,面试中经常被问到,但是很多人只会最简单的单例模型,可能连多线程都没考虑到,本文章从最简单的单例,到认为是最佳的单例模式实现方式,单例模式没有什么知识点,直接上源码
168 0
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
49 16
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
78 0
|
8月前
|
C++ QT 单例模式
C++ QT 单例模式
156 0
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
123 2
C++从静态类型到单例模式
C++从静态类型到单例模式
69 0
C++ -- 单例模式
**摘要:** 单例模式确保一个类仅有一个实例,并提供全局访问点。为了实现单例,构造函数通常设为私有,通过静态成员函数来创建和返回实例。两种常见实现是饿汉模式(在类加载时创建实例,线程安全但可能导致不必要的内存占用)和懒汉模式(首次使用时创建,可能需线程同步)。拷贝构造函数和赋值运算符通常被禁用来防止额外实例的创建。单例模式适用于资源管理、缓存和线程池等场景。在C++中,静态成员变量和函数用于存储和访问单例实例,保证其生命周期与程序相同。
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
80 5

热门文章

最新文章

下一篇
oss创建bucket