我希望有一个类(这是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()。第一个对象,整个过程中没有人工干预列表清除,重新填充,删除,重新排序等时的代码?
答案 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.
};