2010-05-15 101 views
1

使用C++,有沒有辦法讓派生類繼承自己的靜態初始化器?我正在嘗試做如下操作:靜態初始化派生類

class Base { 

public: 
     class StaticInit { 
       public: 
       virtual StaticInit() =0; 
     }; 
}; 



class Derived: public Base { 
    public: 
     virtual StaticInit::StaticInit() { 
      //do something with the derived class 
     } 
     static StaticInit init; 
    } 

static Derived::StaticInit init; 

如果我不必在每個派生類中定義init var,它也會很好。我目前在每個派生類中重新定義了StaticInit內部類,但它似乎是多餘的。

每個派生類是一個單例,我需要在程序啓動時將實例存儲在查找表中。

回答

2

我使用模板來做到這一點,而不是繼承 - 是這樣的:

template <typename T> 
struct StaticInit { 
    StaticInit() { 
     // do whatever with T 
    } 
}; 
使用

static StaticInit <SomeClass> init; 
+0

我基本上走你解。 – 2010-05-18 11:17:38

2

使用CRTP

template <class D> 
class Base { 
public: 
    class StaticInit { 
    public: 
     StaticInit() { D::initStatic(*this); } 
    }; 
    static StaticInit init; 
}; 

template <class D> 
Base<D>::StaticInit init; 

class Derived: public Base<Derived> { 
public: 
    initStatic(Base<Derived>::StaticInit& s) { 
     // Do derived-specific initialisation on s. 
    } 
} 
+0

這就是我一直在尋找的。謝謝 – 2010-05-15 22:37:25

+0

我得到一個編譯器錯誤在線基地 :: StaticInit初始化; 預期的構造函數,析構函數或在'init'之前的類型轉換 我認爲應該是基本的 :: StaticInit Base :: init; 但我仍然得到相同的錯誤,但現在基地 2010-05-15 23:50:16