/** * @file NFSingleton.h * @brief ½Ì±ÛÅæ Ŭ·¡½º * @remarks * @author °­µ¿¸í(edith2580@gmail.com) * @date 2009-04-02 */ #pragma once #include #include #include /* #include "NFSingleton.h" class Test : public Nave::NFSingleton { public: Test() { printf("Test::Test()\n"); } ~Test() { printf("Test::~Test()\n"); } int GetType() { return 0; } }; INT _tmain(INT argc, WCHAR* argv[]) { // ¸¸¾à ½Ì±ÛÅæ °´Ã¼¸¦ »ç¿ëÇÏ·Á¸é // ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇϱâ À§Çؼ­ Çѹø New¸¦ Çϰí Test* pTest = new Test; // ´Ù¸¥ À§Ä¡ÀÇ ´Ù¸¥ÇÔ¼ö. Test::GetInstance().GetType(); ¿Í °°ÀÌ »ç¿ëÇÏ¸é µÈ´Ù. delete pTest; } */ #pragma warning (disable : 4311) #pragma warning (disable : 4312) namespace Nave { /** * @class NFSingleton * @brief Ŭ·¡½º °´Ã¼¸¦ ½Ì±ÛÅæÀ¸·Î »ý¼ºÇÕ´Ï´Ù. * @remarks * * @warning ÇØ´ç ½Ì±ÛÅæ °´Ã¼´Â óÀ½ »ý¼ºÀº Á÷Á¢ new·Î »ý¼ºÀ» ÇØÁÖ°í \r\n * delete°¡ µÉ¶§±îÁö ½Ì±ÛÅæ °°ÀÌ »ç¿ëÇϸç ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ¶§\r\n * delete¸¦ ÇØÁÖ¸é µÈ´Ù. * @par * @author Edith * @date 2009-04-05 */ template class NFSingleton { public: /// NFSingleton »ý¼ºÀÚ NFSingleton (void) { assert( !s_pSingleton && "NFSingleton : You can't create more" " object, because this object is SINGLETON."); #if defined( _MSC_VER ) && _MSC_VER < 1200 int iOffset = (int)(T*)1 - (int)(NFSingleton *)(T*)1; s_pSingleton = (T*)((int) this + iOffset); #else s_pSingleton = static_cast< T* >( this ); #endif } /// NFSingleton ¼Ò¸êÀÚ ~NFSingleton (void) { assert( s_pSingleton && "NFSingleton : This object may be " "destroyed by someone's memory control or other causes."); s_pSingleton = 0; } /// ÇØ´ç ½Ì±ÛÅæ °´Ã¼°¡ »ý¼ºµÇ´ÂÁö È®ÀÎÇÑ´Ù. static bool IsAlive() { return s_pSingleton ? true : false; } /// ½Ì±ÛÅæ °´Ã¼ÀÇ ÀνºÅϽº¸¦ ¾ò´Â´Ù. static T& GetInstance(void) { assert (s_pSingleton && "NFSingleton : Something is wrong." " This object destroyed by something bad method or" "you didn't create yet!"); return *s_pSingleton; } /// ½Ì±ÛÅæ °´Ã¼ÀÇ À¯ÀÏÇÑ ÀνºÅϽºÀÇ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù static T* GetInstancePtr(void) { assert (s_pSingleton && "NFSingleton : Something is wrong." " This object destroyed by something bad method."); return s_pSingleton; } private: /// ½Ì±ÛÅæ °´Ã¼¸¦ ´ãÀ» °´Ã¼ÀÇ Æ÷ÀÎÅÍ static T* s_pSingleton; }; /// ½Ì±ÛÅæ °´Ã¼ º¯¼ö¸¦ ÃʱâÈ­ ÇÑ´Ù. template T* NFSingleton::s_pSingleton = 0; }