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语言中,从相同的基类派生类型并在集合中使用该基类是很常见的。@Blindyvoid*
不是我所说的类型擦除。类型擦除类似于std::function
,在这种情况下,除了您关心的内容之外,您可以擦除类型的所有内容(然后公开这些公共属性,而不会造成干扰,也不会向类型中注入接口)。即使在这种情况下,在std::list
中存储指向接口的原始指针仍然很少是一个好主意。当一个不知道类和对象之间的区别的人问这个问题时,这通常不是他们应该做的事情。