您的位置:首页 > 编程语言 > C语言/C++

C++模板实现单例模式

2017-04-06 21:54 211 查看
单例模式的代码重复率太高,所以我就用模板来实现,提高了代码复用率

单例模式的实现要点:

1. 构造函数私有

2. 暴露一个函数来获取实例

可以用模板实现保存和获取实例,子类只要继承模板类就可以了

这里有个问题就是子类的构造函数是private的那么父类也不能构造,所以还需要把父类声明为友元类,这里用了宏来实现

#pragma once

template<class T>
class Singleton
{
protected:
Singleton() = default;
virtual ~Singleton() = default;

public:
static T& GetInstance()
{
static T s_instance;
return s_instance;
}
};

#define DECL_SINGLETON(T) friend class Singleton<T>


上面是把实例放在函数的静态局部变量了,这样是第一次调用GetInstance时初始化实例

另一种写法是把实例放在类的静态变量里,这样就和全局变量一样是在main函数之前初始化。因为要放到头文件里,所以要用Visual C++特有的关键字
__declspec(selectany)
来避免重定义

#pragma once

template<class T>
class Singleton
{
protected:
Singleton() = default;
virtual ~Singleton() = default;

private:
static T s_instance;
public:
static T& GetInstance()
{
return s_instance;
}
};

template<class T>
__declspec(selectany) T Singleton<T>::s_instance;

#define DECL_SINGLETON(T) friend class Singleton<T>


使用方法:

class A final : public Singleton<A>
{
DECL_SINGLETON(A);
private:
A() = default;
virtual ~A() = default;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息