抽象シングルトン クラスがあります。私の目標は、サブクラスが init() 関数を実装するだけで、それ以外は何も実装しないことです。これが私がしたことです:
template <typename T>
class Singleton
{
public:
Singleton()
{
init();
}
static T& instance()
{
static T instance;
return instance;
}
protected:
virtual void init() = 0;
};
class SubSingleton : public Singleton<SubSingleton>
{
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};
init() は保護されており、public static 関数から呼び出すことができないため、これはコンパイルされません。この問題には 2 つの解決策があります。最初に init() 関数を公開できますが、この関数を公開したくありません。したがって、これは2番目のソリューションのみを残し、サブクラスを次のように変更します。
class SubSingleton : public Singleton<SubSingleton>
{
friend class Singleton<SubSingleton>;
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};
これは完全に機能しますが、他のプログラマーが私のコードを拡張し、これを追加する必要があることを知らない可能性があるため、friend ステートメントは必要ありません。
フレンドステートメントなしでこれを実装する他の方法はありますか? アンドレイ・アレクサンドレスクの何か?
編集: init 関数は、instance() 関数の代わりにコンストラクターで呼び出されるようになりました。
EDIT2: 技術的な理由と互換性のために、init() 関数が必要であり、コンストラクターで初期化を行うことはできません。
キャストの解決策は機能しますが、コンストラクターから init() を呼び出すと、キャストが機能しなくなります。助言がありますか?