編集:コードに説明を追加しました。
テンプレートを使用したソリューションは次のようになります。
作成時にグローバル アクセスを持つインスタンスを持つ必要があるクラスのテンプレートを作成しました。これがあなたの望むものだと思います。(名前のデザインパターンを参照してSingletonと名付けました) .h:
// C++ header for template Singleton
template<typename T>
class Singleton : public T {
static Singleton<T>* instance;
Singleton();
public:
static Singleton<T>* getInstance();
};
getInstance() メソッドは、そのインスタンスを取得する場所からのものになります。ポインターの代わりにオブジェクトにすることもできますが、実行時にインスタンスを変更するなど、より複雑なことをしたい場合に汎用性が高いため、この方法の方が気に入っています。また、使用時にのみオブジェクトをインスタンス化できるため、メモリ割り当てが不要になります。.cpp:
// C++ source for template Singleton
template<typename T>
Singleton<T>* Singleton<T>::instance = NULL;
template<typename T>
Singleton<T>::Singleton()
: T()
{}
template<typename T>
Singleton<T>* Singleton<T>::getInstance()
{
if (instance == NULL)
{
instance = new Singleton<T>();
}
return instance;
}
必要な任意のクラスを通常どおり実装し、Singleton テンプレートを使用して、特定のクラスの同じグローバル インスタンスを常に処理できるようにすることができます。必要に応じて、typedef を使用して型名を定義することもできます。あなたのクラス定義:
// Definition of class foobar
class foobar_impl {
public:
int a;
};
typedef Singleton<foobar_impl> Foobar;
次に、テンプレートを使用して foobar_impl のインスタンスを取得します。
int main(int argc, char** argv)
{
Foobar *pf = Foobar::getInstance();
return 0;
}
ただし、このソリューションの問題は、Singleton テンプレートが空のコンストラクターを持つクラスでのみ機能することです。しかし、あなたの例もそうなので、これがあなたが望むものだと思います。