列表的继承及其第一个组件

时间:2013-05-01 14:48:50

标签: c++ multiple-inheritance

我希望有一个类(这是C ++)继承自加权组件列表,并继承自列表组件的类型,这样我就可以直接访问第一个成员。我不确定这是怎么可能的,但基本上我希望能做的是:

class Component;

class WeightedComponent: public pair<Component,float>; 

class WeightedList : public list<WeightedComponent> : public Component;

然后我的大多数代码都围绕构建和操作此列表(而不是Component本身)。我想做的是,以下情况总是如此

WeightedList weightedList;
// ... fill the weightedList with various WeightedComponents ...
(Component*)(&weightedList) == &(weightedList.begin().first)

所以有一种方法可以设置我的WeightedList类,它的基本Component对象总是(或指向)它的基本list.begin()。第一个对象,整个过程中没有人工干预列表清除,重新填充,删除,重新排序等时的代码?

1 个答案:

答案 0 :(得分:0)

这不能以你建议的方式完成:如果你创建一个新的WeightedList,这将始终是一个新的,唯一的对象,它不能与列表的(单独的)第一个元素“相同” 。还要考虑空列表的情况,Component WeightedList部分应如何表现?

一个解决方案是,实现一个单独的first_component函数,它返回对第一个组件的引用,这样就可以像

一样访问它
Component& first = weightedList.first_component();
first.doSomethingWithFirstComponent();

还可以做的是将Component实现为 interface ,即纯虚方法的集合:

class Component {
public:
    virtual void method1() = 0;
    virtual void method2() = 0;
};

然后将当前Component设计为具体子类

class ComponentImpl : public Component {
/// Implement Component's methods
};

然后,您还可以在Component类中实现WeightedList,并通过将方法委托给第一个元素来实现这些方法

class WeightedList : public list<Component,float>, public Component {
public:
  void method1() {
    this->front().get<0>().method1();
  }
  // etc.
};