0

だから私は単純なシングルトンテンプレート基本クラスを持っています(質問の目的で縮小されています):

template <typename T>
class Singleton {
public:
    static T& instance() {
        static T me;
        return me;
    }
};

ここで、「シングルトンの基本クラス」が必要です。

class Base : public Singleton<Base> {
public:
    void print() { std::cout << &instance() << std::endl; }
}

私が今欲しいのは、この基本クラスから子クラスを派生させることです。これは、独自のシングルトンです。

class A : public Base {
    // ...
}

class B : public Base {
    // ...
}

もちろんこれをすれば

A::instance().print();
B::instance().print();

どちらの場合も同じアドレスを取得します。これを達成する方法はありますか?

何のために疑問がある場合:ResourceManagerクラス、クラス'AudioManager'などによって継承されている基本クラスをプログラムしImageManagerたい。そして、実際には同じインスタンスを共有しないようにしたいが、それでもマネージャーごとに1つのインスタンス...

4

3 に答える 3

6

Baseをテンプレートにして、に渡し、これを実現したい場合はSingletonから継承する必要があります。Base<A>または、Baseをシングルトンにし、Singleton<A> A / Bをシングルトンにする場合は、Singleton<B>に加えて、から継承する必要がありBaseます。

しかし、親愛なる主よ、シングルトンは百世代にわたってあなたとあなたの子供たちへの呪いです。なぜあなたは自分自身にそれをするのですか?

于 2012-10-16T21:19:26.040 に答える
1

私の提案は、Baseを非シングルトンクラスにしてから、Baseクラスをインスタンス化するクラスAおよびクラスBのシングルトンにすることです。これにより柔軟性が得られ、継承よりも構成を優先するというオブジェクト指向の原則に従いますhttp://www.artima.com/lejava/articles/designprinciples4.html

シングルトンには静的メンバーが必要なため、シングルトンクラスから直接継承することはできません。作曲は、この状況で、そして他のほとんどの状況でもあなたに役立つでしょう。

于 2012-10-16T21:27:12.393 に答える
1

基本クラスがその子から何かを持たなければならないときに私が見る最良の解決策は、次のようにBaseへの引数としてChildを使用することです。

template< bool val, class TrueT, class FlaseT >
struct If {
    typedef TrueT type;
};
template< class TrueT, class FalseT >
struct If< false, TrueT, FalseT > {
    typedef FalseT type;
};
template< class DerivedT = void >
class Base {
public:
    typedef typename If<std::is_same<DerivedT, void>::value,
        Base<DerivedT>, DerivedT>::type this_type;
    static this_type& instance() {
        this_type me;
        return me;
    }

public:
    void test() {}
};
class A : public Base<A> {
public:
    void print() {}
};
class B : public Base<B> {
public:
    void print() {}
};
Base<>::instance().test();
B::instance().print();
A::instance().print();
于 2012-10-16T21:27:38.520 に答える