//--------------------------------------------------------------------------- /* シングルトンポインタ Ver.1.2 by Gimite 市川 シングルトン(アプリケーション内でそのクラスのインスタンスが唯一つしかな い事を保証する)を管理するポインタ。 ex. class Foo{ Foo(){ … } //コンストラクタはprivate Foo(const Foo&); //コピー禁止 ~Foo(){ … } //デストラクタもprivate friend class gimite::singleton_ptr; }; static gimite::singleton_ptr pfoo; //[1] ヘッダファイルに上のように記述すると、pfooをFooの唯一のインスタンスへのポ インタのように扱う事ができます。例えば、Foo::f()が存在するならpfoo->f()で アクセスできます。Fooインスタンスの作成、削除はsingleton_ptrが行います。 「ヘッダファイルにstaticなsingleton_ptrを置く」のがミソです。理由はソース を睨むか「注解C++リファレンスマニュアル」を読んでください。 気になるFoo::Foo()が呼び出されるタイミングですが、 ・全ての翻訳単位内の、[1]以降に定義される全てのグローバル変数のコンスト クタより前。 ・2つのクラスFoo、Booをシングルトン化した時、「Fooの[1]が出現する全ての 翻訳単位内で、Fooの[1]より前にBooの[1]が出現する」時、BooはFooより前 に初期化される。 同様にFoo::~Foo()が呼び出されるタイミングは ・全ての翻訳単位内の、[1]以降に定義される全てのグローバル変数のデストラ クタより後。 ・複数のクラスをシングルトン化した時の破棄の順序は初期化の逆順。 となっています。 */ //--------------------------------------------------------------------------- #ifndef GIMITE_singleton_ptrH #define GIMITE_singleton_ptrH //--------------------------------------------------------------------------- namespace gimite{ //--------------------------------------------------------------------------- template class singleton_ptr { singleton_ptr(const singleton_ptr&); singleton_ptr& operator=(const singleton_ptr&); static int& count(){ static int v; return v; } static T*& ptr(){ static T* v; return v; } public: singleton_ptr(){ if (count()++==0) ptr()= new T; } ~singleton_ptr(){ if (--count()==0){ delete ptr(); ptr()= 0; } } T* get(){return ptr();} T& operator*(){return *ptr();} T* operator->(){return ptr();} }; //--------------------------------------------------------------------------- }//namespace gimite //--------------------------------------------------------------------------- #endif