[英]How to store an abstract templated class with an abstract template type in STL container?
[英]Using abstract class as a template type
我仍然是c ++的新手(来自java)。 我有一个类型为Actor
的stl列表。 当Actor
只包含“真实”方法时,没有问题。 我现在想要将这个类扩展到几个类,并且需要将一些方法改为抽象,因为它们不再具体。
正如我所料(从文档中)这是坏消息,因为你不能再实例化Actor
,所以当我遍历我的列表时,我遇到了问题。
c ++的方法是什么?
对不起,如果有什么不清楚的话
你不能直接处理这个:
正如您所看到的,当类是抽象的时,您无法实例化该对象。
即使不抽象的类,由于切片问题,也无法将派生对象放入列表中。
解决方案是使用指针。
所以第一个问题是谁拥有指针(所有者的响应能力是在其生命周期结束时删除它)。
使用std :: list <>,列表通过创建对象的副本并获取副本的所有权来获得所有权。 但是指针的析构函数什么都不做。 您需要手动调用指针上的delete来获取要激活的obejct的析构函数。 所以当std :: list <>需要占有权时,它不是保持指针的好选择。
// Objects are owned by the scope, the list just holds apointer.
ActorD1 a1; Actor D1 derived from Actor
ActorD2 a2;
ActorD2 a3;
std::list<Actor*> actorList;
actorList.push_back(&a1);
actorList.push_back(&a2);
actorList.push_back(&a3);
这工作正常,因为列表将超出范围,然后对象一切正常。 但这对动态(运行时)创建的对象不是很有用。
Boost提供了一组处理指针的容器。 您赋予容器指针的所有权,当容器超出范围时,容器会破坏对象。
boost::ptr_list<Actor> actorList;
actorList.push_back(new ActorD1);
actorList.push_back(new ActorD2);
actorList.push_back(new ActorD2);
如果Actor类型是抽象的,则无法创建std::list<Actor>
。 在引擎盖下,列表将包含模板参数中指定类型的实例。 因为你不可能拥有抽象类的实例,所以这不会起作用。
你可以做的是使用像指针一样的间接级别。 拥有一个指向抽象类的指针的实例是合法的,因此合法地创建一个stl::list<Actor*>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.