Singleton

Last-modified: 2014-01-05 (日) 21:59:39
  • あるクラスが、必ず1つのインスタンスしか持たないことを保証
  • そのオブジェクトの割り当てと破棄をコントロール
  • グローバル名前空間の汚染を回避
#include

class Singleton{
public:
	static Singleton& GetInstance();
private:
	Singleton(){ std::cout << "CreateInstance" << std::endl;  }
	~Singleton(){}
	Singleton(const Singleton&);
	const Singleton& operator =(const Singleton&);
};

Singleton& Singleton::GetInstance(){
	static Singleton instance; // GetInstanceがはじめて呼ばれた時に割り当てられる
	return instance;
}

int main(){
	Singleton &obj1 = Singleton::GetInstance();
	Singleton &obj2 = Singleton::GetInstance();
	Singleton &obj3 = Singleton::GetInstance();
	return 0;
}

出力

CreateInstance // ただ1つだけ生成された
  • 上のコードはスレッドセーフではない

テンプレート化


template<class T>
class Singleton
{
public:
	static T& GetInstance(){
		static T instance;
		return instance;
	}

protected:
	Singleton(){}
	virtual ~Singleton(){}

private:
	Singleton(const Singleton& rhs);
	Singleton& operator=(const Singleton& rhs);
};
class Hoge : public Singleton<Hoge>
{
	friend Singleton<Hoge>; // コレがないとGetInstance内で生成できない

public:
	void Func(){}

private:
	Hoge(){}
	~Hoge(){}

};

Hoge::GetInstance().Func();