这个单件模式如何生成对象

wacn 2006-05-16 12:56:32
template <typename T> class Singleton
{
static T* ms_Singleton;
public:
Singleton(void)
{
assert(!ms_Singleton);
int offset = (int) (T*)1 - (int)(Singleton<T>*)(T*)1;
ms_Singleton = (T*)(int )this + offset;

}
~Singleton(void)
{
assert(ms_Singleton);
ms_Singleton = NULL;
}
static T&GetSingleton(void)
{
assert(ms_Singleton);
return (*ms_Singleton);
}
static T* GetSingletonPtr(void)
{
assert(ms_Singleton);
return ms_Singleton;
}

};
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wacn 2006-05-16
  • 打赏
  • 举报
回复
结帖!
string * Singleton<string>::ms_Singleton = new string("good");
int main(int argc, char* argv[])
{
printf("Hello World!\n");
cout << Singleton<string>::GetSingleton();
return 0;
}
adintr 2006-05-16
  • 打赏
  • 举报
回复
typedef Singleton<string> StrSin;

StrSin::GetSingleton().xxx();
逸学堂 2006-05-16
  • 打赏
  • 举报
回复
static T* ms_Singleton;
~~~~~~~~~
static成员变量,需要在类外初始化。

使用string,
Singleton<string> str;
healer_kx 2006-05-16
  • 打赏
  • 举报
回复
咋这么像我写的啊?
http://spaces.msn.com/healerkx
我上面也有一个,你这个估计不能用啊... ...



sankt 2006-05-16
  • 打赏
  • 举报
回复
这个单件模式很奇怪啊.

方法上面就很怪异.
一般的单件模式是把构造函数设为private 或者 protected.
然后通过成员函数create出来.
sungengyu 2006-05-16
  • 打赏
  • 举报
回复
其实这样用的:

template<typename T>
T* Singleton<T>::ms_Singleton = 0 ;


Singleton<string> t ;
t.GetSingleton() ……

有调用者保证同一时刻不能有两个 Singleton<string> 对象存在。
sungengyu 2006-05-16
  • 打赏
  • 举报
回复
ms_Singleton; 是私有的,另外 Singleton 还有构造函数呢。

64,648

社区成员

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

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