- あるクラスが、必ず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();