单件模式的基类,C++
来源:互联网 发布:苏州公司网络注册 编辑:程序博客网 时间:2024/06/11 01:28
看《游戏编程精粹1》中间有一段代码
#include <cassert> // 一个单件模式的模板类 template<typename T> class SingleTon { public: static T* ms_SingleTon; SingleTon() { assert(!ms_SingleTon); int offset = (int)(T*)1 - (int)(SingleTon<T>*)(T*)1; ms_SingleTon = (T*)((int)this + offset); } ~SingleTon() { assert(ms_SingleTon); ms_SingleTon = 0; } static T& GetSingleTon() { assert(ms_SingleTon); return *ms_SingleTon; } static T* GetSingleTonPtr() { return ms_SingleTon; } }; // 初始化 template<typename T> T* SingleTon<T>::ms_SingleTon = 0; // 派生出来的单件类 class Texture; class TextureMgr : public SingleTon<TextureMgr> { public: Texture *GetTexture(const char *pName) { return NULL; } protected: private: }; #define g_TextureMgr TextureMgr::GetSingleTon()
用于实现一个单件模式的基类,其他只有一个实例的类可以由此类派生出来,例如纹理管理类等
1.使用这种方式可以在一定的作用域类进行指针的自创建和销毁,不用担心会创建出多余的对象和指针。
2.而且提供一种派生的手段。
其中 int offset = (int)(T*)1 - (int)(SingleTon<T>*)(T*)1;
这句我理解的不是很清楚。大概是计算一下特化的模板类的指针和特化的类的指针在内存中的偏移值(实际占用的位数的偏移。。。??)。
然后根据这个偏移对特化的模板类进行偏移。。
但是我调试的offset一直是0啊
int a = (int)(int*)1;
int b = (int)(double*)1;
他们的值都是1
应该就是数字1在内存中的表示(0x00000001),然后转换为整形/双精度浮点型/或者其他类型,然后在显示其内存地址。。
同一个编译环境应该都是一样的吧。。不太清楚。。
回顾一下一般的方法吧,貌似是不能派生,而且是要用指针来实现,不能够自动销毁内存的。
// 一般使用的方法 class Ston { public: static Ston *ms_pSton; static Ston* CreatePtr() { if (ms_pSton) { return ms_pSton; } else { ms_pSton = new Ston; return ms_pSton; } } }; Ston* Ston::ms_pSton = NULL;
再粘贴一段两者的使用
void TestFunc1() { TextureMgrtMgr; Texture *pTexStone = g_TextureMgr.GetTexture("stone"); } void TestFunc2() { Ston *pSingleton = Ston::CreatePtr(); if (pSingleton) { delete pSingleton; pSingleton = NULL; } } int _tmain(int argc, _TCHAR* argv[]) { int a = (int)(int*)1; int b = (int)(double*)1; TestFunc1(); TestFunc2(); Texture *pTexStone = g_TextureMgr.GetTexture("stone"); return 0; }
当然在Texture *pTex.....一句会有一个断言提示。因为对象已经被销毁了嘛
- 简单的单件模式类(C#)
- 单件模式的基类,C++
- [iOS] Objective-C的单件模式
- [C++] 单件模式的一般实现
- 单件模式基类
- 多线程安全的单件模式,模板基类的单件实现
- 单件模式(c++)
- 单件模式【C++】【转载】
- C语言单件模式
- 创建单件模式的Logger类
- C语言设计模式:单件模式
- 单件模式的疑惑
- php5的单件模式
- C++的单件模式
- 【单件模式】的优点
- 突然感悟到了单件模式的意义(单件和静态类的区别)
- 使用单件注册表的单件模式例子
- 单件模式和不能被继承的类
- mac下使用ipv6观看电视
- 搭建struts2 + spring + hibernate(一):导入jar包篇
- delphi技术专题---获取网卡物理地址之NetBios网络编程接口LANA介绍
- Debug ActiveX Control Using VS2010
- 用递归实现倒序打印
- 单件模式的基类,C++
- 错误 692:调制解调器中发生硬件故障的解决方法
- 编程英雄出少年--学编程趁年轻,时不待我,朝气蓬勃的学子们成功与成名在等待着你们
- ubuntu 10.04下搭建tftp服务器
- webservice:Axis2
- poj2773 Happy 2006(用gcd函数进行的推导)
- UVA 10303 How Many Trees?
- C++ 特性和接口实现原则
- 1000以内的完数