我对c++还是很新(从Java过来)。我有一个Actor类型的STL列表。当Actor仅包含“真实”方法时,没有问题。现在,我想将此类扩展为几个类,并且需要将某些方法更改为抽象方法,因为它们不再具有具体意义。正如我期望的那样(从文档开始),这是个坏消息,因为您无法再实例化Actor,因此当我遍历列表时遇到了问题。用c++做到这一点的方法是什么?对不起,有什么不清楚的地方 最佳答案 您不能直接处理此问题:如您所见,当类为抽象时,您无法实例化该对象。即使该类不是抽象类,由于切片问题,您也无法将派生对象放入列表中。解决方案是使用指针。因此,第一个问题是谁拥有指针(指针的使用生命周期到期时,所有者负责删除指针)。使用std::list 时,列表通过创建对象的拷贝并获得拷贝的所有权来获得所有权。但是指针的析构函数什么也没做。您需要手动调用指针上的delete来激活对象的析构函数。因此,当std::list 也需要拥有所有权时,它不是持有指针的好选择。解决方案1:// Objects are owned by the scope, the list just holds apointer.ActorD1 a1; Actor D1 derived from ActorActorD2 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);
09-11 20:02