아래 소개했던 friend로 간편하게 하는 것과 동적 할당, 동적 할당을 정적으로 사용하도록 atexit() 를 모두 합쳐 보았다.
(주의 사항으로는 이건 클래스 자체에 싱글톤을 합쳐 버린 방식이라는 것을 숙지 하길 ... )
(주의 사항으로는 이건 클래스 자체에 싱글톤을 합쳐 버린 방식이라는 것을 숙지 하길 ... )
/////////////////// <<< Header >>> ///////////////////
/*******************************************************
* Position : /Q_Project/Sington/
/*******************************************************
* 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;
}
/////////////////// <<< 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;
}
'[ Programing ] > Algorithm' 카테고리의 다른 글
[ 흔들림 ] Shake (0) | 2010.02.01 |
---|---|
Singleton은 왠만하면 동적 할당으로 사용하자. (0) | 2010.01.31 |
Sington은 Friend로 사용하여 간단하게 만들자. (0) | 2009.12.28 |
CRC 데이터 전송 검증 (0) | 2009.12.28 |
[ 가속도 ] ( fAfter -fBefore ) /fTime; (0) | 2009.12.24 |