3

私はこれが何度も話されてきたことに気づきましたが、私の問題に対する適切な解決策を見つけられませんでした。Meyerのシングルトンクラスをプロジェクトに実装したばかりですが、それをテンプレートとして作成して、たとえば次のように使用できるようにしたいと思います。

class Game : public Singleton<Game> { /* stuff */ }

そして、私は私のクラスをこのように定義しています

template <typename T>
class Singleton
{
public:
    static T& Instance();

private:
    Singleton();
    //declare them to prevent copies
    Singleton(Singleton const&);
    void operator=(Singleton const&);

};// END OF CLASS DEFINITION


// METHODS' DEFINITIONS

template<typename T>
T& Singleton<T>::Instance()
{
    static T _instance;
    return _instance;
}

ctorを許可するとpublic、シングルトンのビジョン全体が破壊されます。

編集 わかりました、それで私は私のGameクラスを友達になるように更新しましたSingleton<Game>

class Game : public Singleton<Game>
{
friend class Singleton<Game>;
//...
}

しかし今、私は次のようなものを持っています:

'Singleton <Game> :: Singleton()'への未定義の参照

Game::Game()空の関数で

4

2 に答える 2

2

ctor Singleton()->保護されていますか?

于 2012-07-13T09:08:44.923 に答える
2

ctorを公開すると、シングルトンのビジョン全体が破壊されます。

いいえ、そうではありません。Gameプライベートコンストラクタが必要です。のコンストラクターSingletonは関係ありません。のインスタンスは、Singleton<Game>誰もがの別のインスタンスを取得するのに役立ちませんGame。これは、あなたが興味を持っているものです。

とにかく、コンストラクターを宣言できますprotected。または、コンストラクターを保持してprivate、テンプレートパラメーターと友達にすることもできます。ただし、これはC++03では機能しません。ただし、C++11で動作するはずです。しかし、ちょっとしたコツがあります。

template <typename T>
struct wrapper
{
    typedef T type;
};

template <typename T>
class Singleton
{
    friend class wrapper<T>::type;

更新:コンストラクターを呼び出せるようにするには、Game友だちSingleton<Game>になるか、少なくとも、友だちになる必要があります。Singleton<Game>::Instance

于 2012-07-13T09:24:05.623 に答える