drcarter의 DevLog



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