将两个基类实例合并为派生的

时间:2015-05-11 21:32:08

标签: c++ inheritance

我有以下类用于定义具有多个特定节点的树结构

class TreeNode
{
  std::vector<TreeNode*> children;
}
class BTNode: public virtual TreeNode
{
  virtual bool loadAttributes(XML) = 0;
  virtual BTState tick() = 0;

  void otherFunction1() { used by all the different nodes}
  void otherFunction2() { also used by all the node types }
}

可以从XML文件中保存和加载BTNode类的几个特定实现:

class BTSpecificNodeOne: public BTNode
{
  bool loadAttributes(XML) { load node specific data from XML }
  BTState tick() { specific implementation goes here }
}
class BTSpecificNodeTwo: public BTNode
{
  bool loadAttributes(XML) { load node specific data from XML }
  BTState tick() { specific implementation goes here }
}
etc.

我还有一种基于常见树节点基因组类型优化树结构的​​遗传算法:

class TreeNodeGenome: public virtual TreeNode
{
  bool load(XML);
  TreeNodeGenome* crossover(TreeNodeGenome* other);
  virtual void mutate() = 0;
}

此外,要在基因组中使用节点特定实现

class BTSpecificNodeGenomeOne: public BTSpecificNode, public TreeNodeGenome
{
  void mutate() { node specific implementation }
}
class BTSpecificNodeGenomeTwo: public BTSpecificNode, public TreeNodeGenome
{
  void mutate() { node specific implementation }
}
etc.

我希望能够在XML文件中保存和加载优化结果。

BTSpecificNodeOne,BTSpecificNodeTwo等的实现已经有了一个保存/加载函数,我用它来保存结果,但加载它们有点棘手。

BTNode类的加载函数基于BTNode类重建树(来自XML)(节点可以创建也递归加载的子节点)。为了在遗传算法中再次使用它,我还需要从TreeNodeGenome类派生节点。

我可以仅根据TreeNode中包含的信息重建TreeNodeGenome结构,但我不确定如何&#34;合并&#34;这两棵树在一起。

我知道我可以将加载函数复制到BTSpecificNodeGenomeOne,BTSpecificNodeGenomeTwo等类中,但我想知道是否有更简单/更清晰的方法来做它?

编辑:显然我想做的事情在我上一篇文章中有点不清楚。

我已经实现了一个行为树(BT)类,它使用从BTNode派生的许多不同节点:选择器,序列,不同的条件和动作节点。 BT本身以XML格式保存,可以通过BTNode :: loadAttributes()加载。

除此之外,我还有一种可以优化树结构的​​遗传算法。 TreeNodeGenome实现了在进化过程中使用的不同节点的遗传算子。

在进化过程中,我使用了BTSpecificNodeGenomeOne,BTSpecificNodeGenome两个节点,它们实现了不同的BT节点和TreeNodeGenome的遗传算子。 TreeNodeGenome仅需要已在TreeNode基类中编码的树的结构以及变异运算符的节点特定实现。由于BT和可演化的树结构是两个概念上不同的东西,我想将它们分开。

我的问题是:我已经为所有BTNode实现了BTNode :: loadAttributes()函数,它从XML文件加载BT。此函数将其子项创建为BTNode,这是不可演化的。如果我想在进化中使用加载的树,我需要以某种方式&#34; merge&#34;它与TreeNodeGenome对象。

我可以通过在每个派生的BTSpecificNodeGenome中重新实现loadAttributes函数来实现这一点,但我想知道是否有更简洁的方法来执行此操作?

0 个答案:

没有答案