블로그는 나의 힘!
[ Programing ]/Algorithm2010. 1. 12. 08:43
아래 소개했던 friend로 간편하게 하는 것과 동적 할당, 동적 할당을 정적으로 사용하도록 atexit() 를 모두 합쳐 보았다.
(주의 사항으로는 이건 클래스 자체에 싱글톤을 합쳐 버린 방식이라는 것을 숙지 하길 ... )

 

 

/////////////////// <<< Header >>> ///////////////////  

 
/*******************************************************
* Position : /Q_Project/Sington/
* Name Type : Sington.h & cpp
* Made : 2009.12.08 / Min-gyu Kim.
* Ver : v1.0
* explanation : Sington Object
*******************************************************/
#ifndef __OBJECT_SINGTON_Q_H__
#define __OBJECT_SINGTON_Q_H__
 
#define SAFE_DELETE(p) { if(p) { delete(p); (p)=0; } }
 
namespace SINGTON_SPACE
{
     template< typename T >
     class cSingleton
     {
          static T* m_pInstance;
 
     private:
          cSingleton();
          cSingleton( const cSingleton& rhsSingleton );
 
          bool Create();
          bool Destroy();
 
     public:
          ~cSingleton();
 
          friend T& Instance();
     };     // !class cSingleton 
 
     template< typename T > 
     T* cSingleton< T >::m_pInstance = nullptr;   //!< initial 
 
     template< typename T >
     T& Instance();
};     // !namespace SINGTON_SPACE 
 
using SINGTON_SPACE::Instance;
 
#endif      //!< __OBJECT_SINGTON_Q_H__    


 

/////////////////// <<< Cpp >>> /////////////////// 

 
#include "Sington.h"
 
 
namespace SINGTON_SPACE
 
{
     ///////////////////////////////// Global Function START ///////////////////////////////////
     template< typename T >
     T& Instance()
     {
          Create();
          return m_pInstance;
     }
     ///////////////////////////////// Global Function END ///////////////////////////////////

     
///////////////////////////////// Public START ///////////////////////////////////

     template< typename T >
     cSingleton< T >::cSingleton() {   }
 
     template< typename T >
     cSingleton< T >::~cSingleton() {   }
     ///////////////////////////////// Public END ///////////////////////////////////
 

     ///////////////////////////////// Private START ///////////////////////////////////
     template< typename T >
     bool cSingleton< T >::Create()
     {
          if( nullptr == m_pInstance )     //!< Initial
          {
               m_pInstance = new T;

               //!< 프로세스 종료 시 호출 될 함수 등록. 
               //!< 등록된 함수는 등록된 반대 순서로 호출. 

               atexit( Destroy );
               return false;
          }     // !if

         return true;
     }

     template< typename T >
     bool cSingleton< T >::Destroy()
     {
          SAFE_DELETE( m_pInstance );
          return true;
     }
     ///////////////////////////////// Private END ///////////////////////////////////
}     // !namespace SINGTON_SPACE 
 
 
 
EX )
#include "Singleton.h"
#include "tinyxml2.h"
 
class CToolConf : public CSingleton<CToolConf>
{
public:
     CToolConf();
     ~CToolConf(); 

     void Initialize();
     void Release();
 
public:
     BOOL LoadConf( const WCHAR* wszPath );
 
private:
     tinyxml2::XMLDocument m_xmlDoc;
     DBConnectInfo m_dbConnectInfo;
};

 

int main()
{
     WCHAR wszPath[CONF_BUFFER_SIZE] = L"./conf/tool_conf.xml";
     CSingleton<CToolConf>::Instance()->LoadConf( wszPath );
 
     getchar();
     return 0;
}
 
 
 
 

 

Posted by Mister_Q