スレッドセーフとか考えるとあれ結構難しくない?
やっぱシングルトンは良質な水と原料からでないと作れないっぽいです。
だれでも簡単に任意のクラスをシングルトンにできるクラスとか作れないんだろうか。
よく、シングルトンを作るために.cppファイルでstatic変数を
static MyClass*pmyclass=NULL;
とか宣言するのも意味不明でたまに忘れてコンパイルエラーになってめんどくさいし。
シングルトンのクラスをシングルトンじゃなくしたり意外とめんどくさいじゃん。
.cppファイルがいらない、C++のヘッダーファイルだけで簡単にシングルトンを作れるのか考えてみました。
とりあえず getInstance()の関数の中で、
getInstance(){
Singleton<MyClass> a;
return a.a;
}
このように返せばどんなクラスでもシングルトン化できるテンプレートを作成。
これで数行追加するだけでどのクラスもシングルトン化できてだいぶ便利な気がする。
template<typename A> A Singleton<A>::a;
この一行がポイントですね。
ヘッダーファイル内でグローバル変数宣言できるし。
しかもヘッダーファイルを使わないときは、メモリ使われないし。
やっぱテンプレート機能をつかわないとできないのかなぁ。
----------------------------------
#include <cstdio>
//ここからヘッダーファイルのつもり
template<typename A> class Singleton {
public:
static A a;
};
template<typename A> A Singleton<A>::a;
//ここまでヘッダーファイルのつもり
public:
ClassA() {
printf("ClassA()\n");
}
virtual ~ClassA(){
printf("~ClassA()\n");
}
static ClassA& getInstance()
{
Singleton<ClassA> a;
return a.a;
}
void func(){
printf("func()\n");
}
};
int main(int argc, char* argv[])
{
ClassA& ca = ClassA::getInstance();
ca.func();
return 0;
}