2015-04-17 27 views
3

我正在研究应用于抽象基因组类型的遗传算法的实现。基于模板的成员初始化,其中模板是抽象类的衍生

我的设置是这样的:

class AbstractGenome 
{ 
    virtual void init() = 0; 
    virtual void mutate() = 0; 
    . 
    . 
    . 
}; 

class GeneticAlgorithm 
{ 
    std::vector<AbstractGenome*> genomes; 

    void init(int numGenomes) 
    { 
    for (int i=0; i < numGenomes; ++i) 
    { 
     AbstractGenome *genome = new DerivedGenome(); <=This is where my problem is 
     genome->init(); 
     genomes.push_back(genome); 
    } 
    } 

} 

其中DerivedGenome是稍后定义(在某个时候):

class DerivedGenome: public AbstractGenome 
{ 
    void init() { do stuff; } 
    void mutate() {do stuff; } 
} 

我的问题是我唯一知道的DerivedGenome它是从AbstractGenome派生的 - 因此我无法对DerivedGenome构造函数进行全面调用。

解决此问题的一种方法是从GeneticAlgorithm中派生出来,并覆盖所有基因组类型的init函数,但我想知道是否有方法以更好的方式解决此问题,例如通过模板?

非常感谢。

+1

......究竟是什么*是问题? – molbdnilo

+0

好点。看我的编辑。 –

回答

5

你可以通过DerivedGenome类型为init()

template <typename Derived> 
void init(int numGenomes) 
{ 
    for (int i=0; i < numGenomes; ++i) 
    { 
     AbstractGenome *genome = new Derived(); 
     genome->init(); 
     genomes.push_back(genome); 
    } 
} 

,你可以调用通过:

init<DerivedGenome>(42); 

如果你想在情况下,更明确的编译错误,你尝试做init<int>(5),你可以改变返回类型以要求继承:

template <typename Derived> 
typename std::enable_if< 
    std::is_base_of<AbstractGenome, Derived>::value 
>::type init(int numGenomes) { .. } 
+1

非常感谢。这几乎是我所希望的。 –

+0

我已经尝试了您的建议,但我不太确定该怎么做: 体系结构x86_64的未定义符号: “void NSGAII :: init (unsigned int)”,引用来自: _main in main .o 其中我根据你的建议明确定义了我的NSGAII :: init –

+0

@TamásSzabó可能相关[模板只能在头文件中实现](http://stackoverflow.com/q/495021/2069064) – Barry

相关问题