1

汎用シングルトンを作成することは可能ですか? 継承できるものを作成して、シングルトンの機能を取得したいと考えています。静的メンバーを含むテンプレートの使用に問題があります。

これはうまくいかないのですか?

**

更新しました

**

これまでの返信に感謝します。だから今私の問題は、GameEngine がそれ自身のコンストラクターを認識できないことです。私はそれがプライベートであることを知っていますが、それでも.

Singleton.h

template <typename T>
class Singleton
{
private:
    static std::shared_ptr<T> m_Instance;
public: 
    static std::shared_ptr<T> Instance();
};

template<typename T>
std::shared_ptr<T> Singleton<T>::m_Instance = nullptr;

template<typename T>
std::shared_ptr<T> Singleton<T>::Instance()
{
if(m_Instance == nullptr)
    m_Instance = std::make_shared<T>();

return m_Instance;
}

GameEngine.h

class GameEngine : public Singleton<GameEngine>
{
private:
GameEngine();

};
4

2 に答える 2

6

のインスタンスをさらに作成することを妨げるものは何もないので、それがどのように機能するかわかりませんGameEngine

シングルトンを作成する一般的な方法 (おそらくマクロを含む) が可能であったとしても (実際にそうである)、実際にシングルトンが必要な状況はまれであるため、私はそれをお勧めしません。言い換えると...実際にシングルトンが必要な状況はまれです。

于 2012-12-06T19:55:02.960 に答える
1

シングルトンを作成する最良の方法は次のとおりです。

class GameEngine
{
public:
    static GameEngine& instance() { static GameEngine e; return e; }

private:
    GameEngine() {}
    GameEngine(const GameEngine&) = delete;
};

e 変数は、インスタンスへの最初の呼び出しで (スレッドセーフに) 初期化され、通常のプロセス終了時に破棄されます。private/deleted コンストラクターは、2 番目のインスタンスが作成されるのを防ぎます。

于 2012-12-06T20:23:37.330 に答える