1

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

class Component;

class WeightedComponent: public pair<Component,float>; 

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

然后我的大部分代码都围绕着构建和操作这个列表(而不是组件本身)。我想要做的就是让以下情况始终如此

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

那么有没有一种方法可以设置我的 WeightedList 类,使其基本 Component 对象始终(或指向)其基本 list.begin().first 对象,而无需在列表清除、重新填充、删除时在整个代码中进行手动干预,重新排序等?

4

1 回答 1

0

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

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

Component& first = weightedList.first_component();
first.doSomethingWithFirstComponent();

还可以做的是实现Componentinterface,即纯虚方法的集合:

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

然后将您当前的组件设计为具体的子类

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.
};
于 2013-05-01T17:54:28.633 回答