ogre学习1——ogreSingleton类
来源:互联网 发布:有哪些经济数据库 编辑:程序博客网 时间:2024/06/18 04:17
#ifndef _SINGLETON_H__#define _SINGLETON_H__// Added by Steve Streeting for Ogre#include "OgrePrerequisites.h"#include "OgreHeaderPrefix.h"#if OGRE_COMPILER == OGRE_COMPILER_MSVC// Turn off warnings generated by this singleton implementation# pragma warning (disable : 4311)# pragma warning (disable : 4312)#endif#if defined ( OGRE_GCC_VISIBILITY )# pragma GCC visibility push(default)#endifnamespace Ogre {/** \addtogroup Core* @{*//** \addtogroup General* @{*/// End SJS additions /** Template class for creating single-instance global classes. */ template <typename T> class Singleton {private:/** \brief Explicit private copy constructor. This is a forbidden operation.*/Singleton(const Singleton<T> &);/** \brief Private operator= . This is a forbidden operation. */Singleton& operator=(const Singleton<T> &); protected: static T* msSingleton; public: Singleton( void ) { assert( !msSingleton );#if defined( _MSC_VER ) && _MSC_VER < 1200 int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1; msSingleton = (T*)((int)this + offset);#else msSingleton = static_cast< T* >( this );#endif } ~Singleton( void ) { assert( msSingleton ); msSingleton = 0; } static T& getSingleton( void ){assert( msSingleton ); return ( *msSingleton ); } static T* getSingletonPtr( void ){ return msSingleton; } };/** @} *//** @} */}#if defined ( OGRE_GCC_VISIBILITY )# pragma GCC visibility pop#endif#include "OgreHeaderSuffix.h"#endif
Singleton( void ) { assert( !msSingleton );#if defined( _MSC_VER ) && _MSC_VER < 1200 int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1; msSingleton = (T*)((int)this + offset);#else msSingleton = static_cast< T* >( this );#endif }这个构造函数,折腾了一上午,最后问人明白了。
_MSC_VER是VS的版本宏 1700是VS2012,1600是2010,1200就是5.0啦。
当时还没有static_cast来方便的实现从基类到子类的转换,所以,需要计算偏移量。
然后,将Singleton类的指针转换为Singleton的子类指针然后保存到msSingleton里。
注:之所以需要转换为子类,是因为,Singleton只提供了,单件的功能,并没有提供其他的功能。
- ogre学习1——ogreSingleton类
- Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
- OGRE代码学习——场景查询
- ogre场景查询—简单学习
- OGRE学习(1)
- OGRE入门学习整理1——使用Visula Studio 2008 创建可以带走的Ogre应用程序
- ogre代码学习——场景、天空面、雾化
- ogre代码学习——地形 手工和cfg创建
- 学习OGRE~~
- 学习Ogre
- Ogre学习
- ogre 学习
- ogre学习
- 学习OGRE~~
- Ogre——画线
- Ogre学习笔记(1):Basic Tutorial
- Ogre源码分析与学习笔记-1
- OGRE渲染流程学习记录1
- oracle 调用webservice
- SharePoint中的"用户或用户组"栏
- 关于GPIO
- oracle自增auto_increment与oracle 创建触发器是非法的 ORA-04098: trigger 'USER_TRIGGER'is invalid and failed re-v
- 关于总线、设备、驱动
- ogre学习1——ogreSingleton类
- 数据类型不一致导致的SQL不走索引
- channelartlist 支持currentstyle属性
- JavaEE---Servlet会话跟踪之Cookie
- CSS代码
- open淘宝酒店API open淘宝属性API open淘宝类目API
- 豆瓣上的好书:《藏地密码》-全集-epub格式
- 关于Latex中交叉引用表格时标号不对的问题解决
- codeforces_4A Watermelon