私は多くのものがシングルトンであるユーティリティクラスのライブラリを書いています。私は継承を使ってそれらを実装しました:複数のシングルトンインスタンス
template <class T>
class Singleton {
public:
T& getInstance() {
if(m_instance == 0) {
m_instance = new T;
}
return m_instance;
}
private:
static T* m_instance;
};
class SomeClass : public Singleton<SomeClass> {
public:
SomeClass() {}
virtual ~SomeClass() {}
void doSomething() {;}
};
明らかに、これは実際のクラスではなく、簡単な例です。とにかく、私は次のようなコードを使用してそれを見つける:
SomeClass::getInstance().doSomething();
SomeClassの複数のインスタンスを作成します。私はこれが私の図書館(.a)ファイルの外でも内部的にも使用されていることが原因であると考えています。たとえば、自分で作成していないUIライブラリを使用していますが、これは別にコンパイルされており、追加することにしています。これらの追加の中には、私の.aライブラリでも使われているシングルトンを利用するものがあります。
別の編集がこれを引き起こしていますか?他に何か?
問題を回避するための唯一の方法は、必要なシングルトンで初期化するmain.cppファイル内にグローバルオブジェクトを作成することです。私は、このオブジェクトに、私は別のシングルトンを作成するたびに、追加のメソッドを追加する必要が嫌い
GlobalObject::getSomeClass().doSomething()
:そして、すべてのコードは、以下のような呼び出しで、この共通のグローバルオブジェクトにアクセスします。プラス構文は、最初のアクセス方法を使用して明確にし、より身近なようだ:
SomeClass::getInstance().doSomething();
あなたが任意の考え、意見、など
感謝を持っているなら、私に知らせてください。
シングルトンを実装する方法とC++のスレッドセーフティについての素晴らしい議論は、このペーパーで見つけることができます。 http://www.aristeia.com/Papers/DDJ%5FJul%5FAug%5F2004%5Frevised .pdf –