#ifndef _CSINGLETON_H_ #define _CSINGLETON_H_ #include template class CSingleton { private: static Derived* ms_pSingleton; protected: CSingleton(); ~CSingleton(); public: static Derived& GetInstance(); static Derived* GetInstancePtr(); }; template CSingleton::CSingleton() { assert(!ms_pSingleton && "Singleton Ŭ·¡½º°¡ ÀÌ¹Ì »ý¼ºµÇ¾î ÀÖ½À´Ï´Ù."); size_t nOffset = (size_t)(Derived*) 1 - (size_t)(CSingleton*)(Derived*) 1; ms_pSingleton = (Derived*)((size_t)this + nOffset); } template CSingleton::~CSingleton() { assert(ms_pSingleton && "Singleton Ŭ·¡½º°¡ »ý¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù"); ms_pSingleton = 0; } template inline Derived& CSingleton::GetInstance() { assert(ms_pSingleton && "Singleton Ŭ·¡½º°¡ »ý¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù"); return (*ms_pSingleton); } template inline Derived* CSingleton::GetInstancePtr() { assert(ms_pSingleton && "Singleton Ŭ·¡½º°¡ »ý¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù"); return (ms_pSingleton); } template Derived* CSingleton::ms_pSingleton = 0; // Scotte Meyer's Implementation template class CStaticSingleton { public: inline static Derived& GetInstance() { static Derived Instance; return Instance; } }; template class CLeakStaticSingleton { public: inline static Derived& GetInstance() { static Derived* lpInstance = new Derived; return *lpInstance; } }; // C++ FAQ's Implementation template class CNiftyCounterSingleton { public: CNiftyCounterSingleton() { ++nifty_count_; } ~CNiftyCounterSingleton() { if ( 0 == --nifty_count_ && pInstance_ ) { delete pInstance_; } } static T& GetInstance() { if (NULL == pInstance_) { pInstance_ = new T; } return *pInstance_; } private: static int nifty_count_; static T* pInstance_; }; template int CNiftyCounterSingleton::nifty_count_ = 0; template T* CNiftyCounterSingleton::pInstance_ = 0; /* Ŭ·¡½º Çì´õ¿¡ ´ÙÀ½À» Æ÷ÇÔÇÒ °Í. Ŭ·¡½º »ý¼º, ¼Ò¸êÀÚ´Â privateÀ̰í, CNiftyCounterSingletonÀ» ¸â¹ö·Î °¡Áú °Í. namespace { CNiftyCounterSingleton TNiftyCounter; } */ #endif