2011-06-17 4 views
1

これは解決されたと確信していますが、実際には統合された回答は見つかりませんでした。このシングルトンの問題(クラスではない)

単なる関数であり、初期化を保証し、Tが演算子、必要なコンストラクタ、関数などをサポートすると仮定した次のシングルトンの問題は何ですか? (私はスレッドの安全性を探していません)。私の場合、他の人がTのオブジェクトをTに作成することは、自分のプログラムの生活のために使いたいデータベースハンドルです。

template<typename T> 
T* getInstance(){ 
    static T instance; 
    if (!instance && !instance.initialize()){ 
     return NULL; 
    } 
    else { 
     return &instance; 
    } 
} 
+0

これはスレッドセーフではありません...それは間違っています。 –

+0

これの主な問題は、シングルトンを使用しようとすることです。シングルトンは反パターンです。 [使用しないでください](http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/) – sbi

答えて

1

コードに間違いがあります。テンプレートタイプが変数の代わりに使用されています。

スレッドセーフティについて気にしないでください(アプリケーションの全期間中、スレッドの安全性を気にしないでください)。しかし、これから始めることもできます:

template<typename T> T* getInstance() 
{ 
    static T instance; 
    return &instance; 
} 
+0

ありがとう、コードを正しく編集するように編集しました。私の問題は、オブジェクトの構築が必ずしも初期化されないということです。しかし、私はそれをオブジェクト構築自体にプッシュすることにあなたのポイントを見ます – Kiran

0

これはコンパイルされません。さらに、シングルトンを使用すると、遅かれ早かれ問題が発生します。例えば、あなたはいつインスタンスを破壊しますか? C++では、一般的に構築と破壊について明示する方が良いです。 static gateway patternexample in C#)を参照してください。

幸運を祈る!

+0

あなたは、 C++で静的インスタンスを手動で破棄する必要がありますが、 'main'が終了した後、逆順で破棄されます。 – fredoverflow

+0

はいフレッドはそうです、それが問題です。破壊の順序は、あなたが実際に何の支配も持っていない建設注文に依存します。 –

関連する問題