我对c++还是很陌生(来自java)。
我有一个 stl 类型列表Actor
. When Actor
仅包含“真实”方法就没有问题。我现在想将这个类扩展到几个类,并且需要将一些方法更改为抽象的,因为它们不再具有具体的意义。
正如我(从文档中)预期的那样,这是坏消息,因为您无法再实例化Actor
,因此当我迭代列表时我遇到了问题。
C++ 的方法是什么?
抱歉,如果有任何不清楚的地方
你不能直接处理这个:
正如您所看到的,当类是抽象类时,您无法实例化该对象。
即使类不是抽象的,由于切片问题,您也无法将派生对象放入列表中。
解决方案是使用指针。
所以第一个问题是谁拥有该指针(所有者有责任在其生命周期结束时删除它)。
使用 std::list 列表通过创建对象的副本并获取副本的所有权来获取所有权。但指针的析构函数不执行任何操作。您需要手动调用指针上的删除来激活对象的析构函数。因此,当 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);
这工作得很好,因为列表将超出范围,然后对象一切工作正常。但这对于动态(运行时)创建的对象不是很有用。
解决方案2:
Boost 提供了一组处理指针的容器。您将指针的所有权授予容器,当容器超出范围时,该对象将被容器销毁。
boost::ptr_list<Actor> actorList;
actorList.push_back(new ActorD1);
actorList.push_back(new ActorD2);
actorList.push_back(new ActorD2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)