2011-07-21 10 views
2

私は抽象クラスを持っている抽象クラスと静的メソッドは

class B:public A 
{ 
    public: 
    int load(); 
    static B& instance(); 
} 

class C:public A 
{ 
    public: 
    int load(); 
    static C& instance(); 
} 

事実は、内のコード::インスタンス()メソッドで同じであるということです各クラス:

static B& B::instance() 
{ 
    static B instance_; 
    if (!instance_.loaded_) 
    { 
    instance_.load(); 
    instance_.loaded_=true; 
    } 
    return instance_; 
} 

static C& C::instance() 
{ 
    static C instance_; 
    if (!instance_.loaded_) 
    { 
    instance_.load(); 
    instance_.loaded_=true; 
    } 
    return instance_; 
} 

この:: instanceメソッドを分解したいと思いますが、仮想メソッド:: load、ic annotはクラスAでそれを定義します。 理論的には、クラスAは0のインスタンスを持ち、BはCのインスタンスが1つである必要があるので、私は気が変わっていますが、このコードを分解しなければなりません。

どのように問題を解決しますか?

あなたは自由関数テンプレート instance()を作ることができ
+1

これを行うには、 –

答えて

8

:、これはCRTPの一般的な用法である

instance<B>().do_stuff() 
3

を作成する関数を定義します。

template<class T> 
T& instance() 
{ 
    static T instance_; 
    if (!instance_.loaded_) 
    { 
    instance_.load(); 
    instance_.loaded_=true; 
    } 
    return instance_; 
} 

は、その後、あなたがこのようにそれを使用することができますテンプレートのインスタンスを作成し、次に各タイプでインスタンス化します。

struct A { 
    virtual ~A() {}  // don't forget to make your destructor virtual! 
    virtual void load() = 0; 
}; 
template <typename T> 
struct instance_provider { 
    static T& instance() { /* implementation */ } 
}; 
struct B : A, instance_provider<B> { 
    virtual void load(); 
}; 
struct C : A, instance_provider<C> { 
    virtual void load(); 
}; 
関連する問題