如何写一个C++的Singleton并且使用?

elemusic 2011-09-20 08:30:25
想做一个游戏全局数据的类,里面有游戏时间,关卡号,残余人数等等,想做成Singleton,不知道这么想对不对。

想了很久google几篇文章看得还是不明白。

C++该如何实现,单线程的就可以,不需要继承的Singleton就可以。

...全文
107 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
elemusic 2011-09-20
  • 打赏
  • 举报
回复
OK,我又傻X了.....不应该用static int...直接int就完了....结了.....
ithzhang 2011-09-20
  • 打赏
  • 举报
回复
打打酱油。
yuanyuan0715 2011-09-20
  • 打赏
  • 举报
回复
也顺便学习下
turing-complete 2011-09-20
  • 打赏
  • 举报
回复
因为有全局变量这一说,C++的单例模式变得太简单了,这是Java做不到的。注意多线程的访问同步问题即可
TomByTed 2011-09-20
  • 打赏
  • 举报
回复
xuexila
elemusic 2011-09-20
  • 打赏
  • 举报
回复
全局变量可以,主要想试试Singleton怎么用.....

#4和我目前写的一样,但是我如果要把static int GameTime;static int GameLevel;这两个变量放进去,我该怎么在外面读写啊?


#include <iostream>
using namespace std;

class Singleton
{
public:
static int GameTime;
static int GameLevel;

public:
static Singleton* getInstance()
{
static Singleton st;

return &st;
}

protected:
Singleton()
{}
~Singleton()
{}

private:
Singleton(const Singleton &);
Singleton& operator = (const Singleton &);
};


int main()
{
Singleton *st=Singleton::getInstance();

return 0;
}

taodm 2011-09-20
  • 打赏
  • 举报
回复
单线程的singleton?那你直接一个全局变量就结了,何苦自己麻烦自己。
ryfdizuo 2011-09-20
  • 打赏
  • 举报
回复
找个loki的包直接用吧。
qq120848369 2011-09-20
  • 打赏
  • 举报
回复
呐,不要说我没提醒你啊,写程序呢,最重要的就是开开森森了...
qq120848369 2011-09-20
  • 打赏
  • 举报
回复
C++该如何实现,单线程的就可以,不需要继承的Singleton就可以。

单线程是很安全的...
#include <iostream>
using namespace std;

class Singleton
{
public:
static Singleton* getInstance()
{
static Singleton st;

return &st;
}

protected:
Singleton()
{}
~Singleton()
{}

private:
Singleton(const Singleton &);
Singleton& operator = (const Singleton &);
};


int main()
{
Singleton *st=Singleton::getInstance();

return 0;
}


多线程:不安全啊不安全...

这又是为什么呢? 因为第一次调用getInstance时候会怎么样呢? 会构造对象st,如果此时CPU切到其他线程,怎么办呢? st还木有构造完全,于是你直接返回&st,使用它~ 这就是static的不安全因素了,方法很多,比如:

#include <iostream>
using namespace std;

class Singleton
{
public:
static Singleton* getInstance()
{
static Singleton st;

while(!finish)
{
sleep(1);
}

return &st;
}

protected:
Singleton()
{
/*do your initialize*/
finish=true;
}

~Singleton()
{}

private:
Singleton(const Singleton &);
Singleton& operator = (const Singleton &);
static sig_atomic_t finish;
};

sig_atomic_t Singleton::finish=false;

int main()
{
Singleton *st=Singleton::getInstance();

return 0;
}
jackyjkchen 2011-09-20
  • 打赏
  • 举报
回复
用static做一个静态实例,返回地址就行了

这是最优雅的单件
jackyjkchen 2011-09-20
  • 打赏
  • 举报
回复
用static做一个静态实例,返回地址就行了
匚匚 2011-09-20
  • 打赏
  • 举报
回复
不懂帮顶

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧