[C/C++] template를 이용한 singleton 패턴 사용.
C / C++2009. 12. 24. 01:51
singleton패턴이라고 하면 단 하나의 객체만을 생성해 주는 패턴입니다.
싱글톤 패턴을 만들려면 클래스 안에 자신의 클래스 포인터가 있어야 하고, 전역으로 그 클래스의 변수도 필요하겠죠.
하지만 template방법으로 하게 되면, 단순히 기존의 클래스를 상속하는 것만으로 만들 수 있는 방법을 알게 되었습니다.
#pragma once #include#include template < typename T > class Singleton { protected: Singleton() { assert(!m_kInstance); long long offset = (long long)(T *)1 - (long long)(Singleton *)(T *)1; m_kInstance = (T *)((long long)this + offset); } ~Singleton() { assert(m_kInstance); m_kInstance = 0; } public: static T * instance() { if (m_kInstance == NULL) m_kInstance = new T; return m_kInstance; }; static void destroyInstance() { if(m_kInstance) { delete m_kInstance; m_kInstance = NULL; } }; private: static T * m_kInstance; }; template T* Singleton ::m_kInstance = 0;
이런식으로 기본의 singleton template 클래스를 만들어 두고 이 클래스를 단순히 상속하여 사용하면 됩니다.
사용 방법은
class MyClass : public Singleton이런식으로 상속하여 자신의 원하는 클래스를 싱글톤으로 만들고 이 상속받은 클래스를 사용하는 방법으로는{ private: public: void MyMethod(); }
MyClass::Instance()->MyMethod();이런식으로 사용하면 되겠습니다.
이런 방법을 사용하게 되니... 단순히 이 클래스를 하나만 정의해 두고, 내가 만든 클래스를 싱글톤 패턴으로 사용하고 싶을 때 이걸 상속해서 쓰면 되는게 편해지더군요. template방법이 어떨 땐 불편할 때도 있었는데.. 이걸 보니.. 좋은점도 있다는 생각이 듭니다.
'C / C++' 카테고리의 다른 글
Collaborative Filtering (0) | 2009.01.19 |
---|---|
C++에서 XML 파일 읽기 (0) | 2008.09.09 |
libcmtd.lib LNK2005 - 중복 선언 에러 (0) | 2008.05.09 |
C++ 클래스 안에서 쓰레드를 생성해 쓰기 (0) | 2008.02.28 |