4

私は熱心に初期化するジェネリックシングルトンクラスで遊んでいます。アイデアは、次のようにクラスからパブリックに継承することです。

class foo : public singleton<foo> { };

私はその過程で多くのことを学びましたが、Visual Studio 2008 リンカが壊れているため、今は立ち往生しています。問題は、静的インスタンス メンバーおよび/またはその初期化にあります。

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T & instance;
};
template<class T> T & T::instance;

どんな洞察も大歓迎です!

編集:

このクラス宣言で...

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T instance;
};
template <class T> T singleton<T>::instance;

これをやろうとすると…

class foo : public singleton<foo> { };

このエラーが発生します...

エラー C2248: 'singleton::singleton': クラス 'singleton' で宣言されたプライベート メンバーにアクセスできません

...

この診断は、コンパイラによって生成された関数 'foo::foo(void)' で発生しました。

私の解釈では、シングルトンは、継承により、コンストラクターがプライベートであるシングルトンの構築に依存する foo オブジェクトを構築したいと考えています。シングルトンは独自のコンストラクターにアクセスできると思いましたが、そうではないと思います。何か案は?

編集2:

singleton<T>から継承するアプローチには、クラスを変更してシングルトンとして使用する必要があるという問題があることに気付きました。熱心に初期化するシングルトン クラス テンプレートのコードは次のようになりました。

template<typename T>
class singleton_wrapper {
    singleton_wrapper();
    singleton_wrapper(singleton_wrapper const &);
    singleton_wrapper & operator = (singleton_wrapper const &);
    static T instance;
    template<typename T> friend T & singleton();
};
template<typename T> T singleton_wrapper<T>::instance;

template<typename T>
T & singleton() {
    return singleton_wrapper<T>::instance;
}

授業のために...

class foo {
public:
    void bar() { }
};

...次を使用して、その単一のインスタンス(main()の前に初期化)にアクセスします。

singleton<foo>().bar();

助けてくれてありがとう、特に GMan。初めてのスタックオーバーフローの経験にとても満足しています。

4

2 に答える 2

7

具体的なインスタンスがないため、できません。参照できる実際のインスタンスを作成する必要がある場合があります。

template <class T>
class singleton {
    ...
private:
    static T instance_;
public:
    static T& instance;
};
template <class T> T singleton<T>::instance_;
template <class T> T& singleton<T>::instance = singleton<T>::instance;

または、より単純に、参照を完全に捨てるだけです。

template <class T>
class singleton {
    ...
public:
    static T instance;
};
template <class T> T singleton<T>::instance;
于 2010-01-18T20:44:06.320 に答える
1

オフザスリーブ: インスタンスのタイプを「T &」ではなく「T」に変更します。

于 2010-01-18T20:43:08.440 に答える