私はユーティリティ クラスのライブラリを作成していますが、その多くはシングルトンです。私は継承を使用してそれらを実装しました:
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();
ご意見、ご感想等ありましたらお聞かせください。
ありがとう。