2010-05-15 149 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