C++ 多个对象的列表c++;

C++ 多个对象的列表c++;,c++,list,class,object,C++,List,Class,Object,我在使用std::list时遇到了一些问题。我可以很好地将它用于“简单”类型的数据列表或一种类型的对象列表 我想创建一个包含三种不同类型对象的列表。例如,有三种类型的对象:类p1、类p2、类p3。 我想创建一个包含这三个对象的列表 class p1 { ... }; class p2 { ... }; class p3 { ... }; int main() { std::list<whatshouldiInserthere?> namelist; } p1类{ ..

我在使用
std::list
时遇到了一些问题。我可以很好地将它用于“简单”类型的数据列表或一种类型的对象列表

我想创建一个包含三种不同类型对象的列表。例如,有三种类型的对象:类p1、类p2、类p3。 我想创建一个包含这三个对象的列表

class p1 {
...
};

class p2 {
...
};

class p3 {
...
};

int main() {
    std::list<whatshouldiInserthere?> namelist;
}
p1类{
...
};
p2类{
...
};
p3类{
...
};
int main(){
std::列表名称列表;
}

我已经尝试使用模板,但没有办法。您可以发布一个示例源代码吗?

whatshouldinerthere
不存在。您需要存储变量(如
boost::variant
boost::any
,等等),这些变量保存类的实例。

  • 您可以使用
    void*
    列表,放弃优雅而现代的解决方案
  • 您可以从基类派生所有对象,然后使列表包含指向该基类的指针
  • 您可以使用
    boost::variant
    boost::any
    作为一种类型安全的
    void*
    。这实际上比听起来要好得多,因为多亏了模板魔术,它没有额外的间接层,并且仍然不需要相同的基类

您将对象与类混合在一起。我首先要问您为什么要这样做?可能有更好的方法。您希望如何使用
名称列表
?除非您计划将数据结构用于某些用途,否则创建数据结构毫无意义。如果您告诉我们如何使用它,我们可以帮助您。告诉我们您将如何将数据放入
名称列表
,更重要的是,您将如何读取
名称列表中的数据
…或者让这三个类从一个基类继承并存储指向该基类的指针。第二个指针是一个完美的方法,因为您的系统需要面向对象的方法。这个答案的问题是,它让幼儿在手枪和,当孩子问“我该如何对付床下的怪物”时,他需要的是一杯水。(哦,你忘了gernade选项:键入擦除)@Yakk,这是第一种情况,称它为
void*
,你就完成了。无论如何,我觉得你有点不对劲,在大多数OOP语言中,从相同的基类派生类型并在集合中使用该基类是很常见的。@Blindy
void*
不是我所说的类型擦除。类型擦除类似于
std::function
,在这种情况下,除了您关心的内容之外,您可以擦除类型的所有内容(然后公开这些公共属性,而不会造成干扰,也不会向类型中注入接口)。即使在这种情况下,在
std::list
中存储指向接口的原始指针仍然很少是一个好主意。当一个不知道类和对象之间的区别的人问这个问题时,这通常不是他们应该做的事情。