繁体   English   中英

使用抽象类作为模板类型

[英]Using abstract class as a template type

我仍然是c ++的新手(来自java)。 我有一个类型为Actor的stl列表。 Actor只包含“真实”方法时,没有问题。 我现在想要将这个类扩展到几个类,并且需要将一些方法改为抽象,因为它们不再具体。

正如我所料(从文档中)这是坏消息,因为你不能再实例化Actor ,所以当我遍历我的列表时,我遇到了问题。

c ++的方法是什么?

对不起,如果有什么不清楚的话

你不能直接处理这个:

正如您所看到的,当类是抽象的时,您无法实例化该对象。
即使不抽象的类,由于切片问题,也无法将派生对象放入列表中。
解决方案是使用指针。

所以第一个问题是谁拥有指针(所有者的响应能力是在其生命周期结束时删除它)。

使用std :: list <>,列表通过创建对象的副本并获取副本的所有权来获得所有权。 但是指针的析构函数什么都不做。 您需要手动调用指针上的delete来获取要激活的obejct的析构函数。 所以当std :: list <>需要占有权时,它不是保持指针的好选择。

解决方案1:

// 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);

这工作正常,因为列表将超出范围,然后对象一切正常。 但这对动态(运行时)创建的对象不是很有用。

解决方案2:

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*>

STL容器专为可复制类型而设计。 您应该查看Boost 指针容器和/或智能指针,以便在集合中存储多态类型实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM