Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 列表及其第一个组件的继承_C++_Multiple Inheritance - Fatal编程技术网

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

C++ 列表及其第一个组件的继承,c++,multiple-inheritance,C++,Multiple Inheritance,我希望有一个类(这是C++),它从加权组件列表继承,并从列表的组件类型继承,这样我就可以直接访问第一个成员。我不确定这是怎么可能的,但基本上我希望能够做到的是: class Component; class WeightedComponent: public pair<Component,float>; class WeightedList : public list<WeightedComponent> : public Component; 那么,有没有一种方

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

class Component;

class WeightedComponent: public pair<Component,float>; 

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

那么,有没有一种方法可以设置我的WeightedList类,让它的基本组件对象始终(或指向)它的基本列表。begin()。第一个对象,无需在整个代码中手动干预,只要列表被清除、重新填充、删除、重新排序,等等?

这不能按照您建议的方式完成:如果您创建一个新的
加权列表
,它将始终是一个新的、唯一的对象,不能与列表的(单独的)第一个元素“相同”。还考虑一个空列表的情况,<<代码>组件>代码> <代码>权重列表>代码>行为>

一种解决方案是,实现一个单独的
first\u component
函数,返回对第一个组件的引用,这样您就可以像

Component& first = weightedList.first_component();
first.doSomethingWithFirstComponent();
还可以将
组件
实现为接口,即纯虚拟方法的集合:

class Component {
public:
    virtual void method1() = 0;
    virtual void method2() = 0;
};
然后将当前组件设计为具体的子类

class ComponentImpl : public Component {
/// Implement Component's methods
};
然后还可以在
加权列表
类中实现
组件
,并通过将方法委托给第一个元素来实现这些方法

class WeightedList : public list<Component,float>, public Component {
public:
  void method1() {
    this->front().get<0>().method1();
  }
  // etc.
};
类权重列表:公共列表,公共组件{
公众:
void method1(){
这->front().get().method1();
}
//等等。
};

类从类继承,但不能从列表继承。我认为你需要先阅读C++语言,了解继承和多态性。然后,如果父函数和数据被声明为受保护或私有,则子类可以访问它们。@Merlin069,实际上,您可以继承类std::list或std::pair(但这不是一个好的做法);然而,我相信这不是asker想要做的。@Merlin069我确实以多项式的等式所暗示的方式从列表中继承。我稍微编辑了我的原始问题,以澄清我需要能够做什么。对不起,我在评论时没有想到STL。我想我在Qt容器上花的时间太多了。谢谢你纠正我-这不是我最美好的时刻!非常感谢您的回答和其他建议。
class WeightedList : public list<Component,float>, public Component {
public:
  void method1() {
    this->front().get<0>().method1();
  }
  // etc.
};