如何实现单例
撰写于 2018-05-30 修改于 2018-05-30 分类 C/C++
单例是C++中经常出现的一种设计模式,保证某一类的实例只有一个。cocos2d-x中就用到了很多单例,Director算是一个很常用的单例,先简单看一下cocos2d-x中是怎么做的,以Director为例:1
2
3
4
5
6
7
8
9
10
11
12
13
14/*CCDirector.cpp*/
static DisplayLinkDirector *s_SharedDirector = nullptr;
Director* Director::getInstance()
{
if (!s_SharedDirector)
{
s_SharedDirector = new (std::nothrow) DisplayLinkDirector();
CCASSERT(s_SharedDirector, "FATAL: Not enough memory");
s_SharedDirector->init();
}
return s_SharedDirector;
}
以上就是cocos2d-x中Director单例的实现,很简单,但是不完美!没有考虑到多线程的安全问题,当然这对cocos2d-x来说已经足够,不用去做多线程的处理,但是在多线程环境里面这个就是有问题了。网上给了很多错误的示例,就不一一展示了,直接说下一最简单,最安全的方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/*Singleton.h*/
class Singleton
{
private:
Singleton();
private:
static Singleton* singleton;
public:
static Singleton* getInstance();
};
/*Singleton.cpp*/
Singleton* Singleton::singleton = new Singleton;
Singleton::Singleton()
{
}
Singleton* Singleton::getInstance()
{
return singleton;
}
有一个地方,Singleton* Singleton::singleton = new Singleton,为什么没有括号呢?搜了一下才知道了这点:
总结一下就是:有括号的,就调用对应的构造函数。没有加括号,如果有自定义的不带参数的构造函数,则调用该构造函数;如果没有定义构造函数,就调用默认的不带参数的构造函数。