是否有某种方法可以根据传递的指针类型分配内存?
这是我的问题:我有一个'bouncyball'和'hero'类都继承自'Actor'。要添加一个弹力球,我打电话给:
_actors.push_back(new Bouncyball());
对于英雄,它将是:
_actors.push_back(new Hero());
由于_actors是Actor指针的向量,因为多态性而起作用。但是我想写一个通用方法来向我的场景中添加新的actor:
unsigned Scene::addActor(Actor * actor){
this->_actors.push_back(new [something]);
}
因为参数可以是Actor的任何衍生物,所以我不知道要为...分配内存...我可以使用case语句解决这个问题,但是如果我稍后派生出其他Actors会怎么样?
答案 0 :(得分:3)
这有什么问题:
unsigned Scene::addActor(Actor * actor){
this->_actors.push_back(actor);
//what do you want to return? why not make return type as void?
}
是否要将actor
添加到_actors
?
您可以将addActor()
称为:
scene.addActor(new Bouncyball());
scene.addActor(new Hero());
确保将Actor
的析构函数声明为virtual
,因为很可能您希望通过基类型的指针(Actor
)删除派生类对象。
答案 1 :(得分:2)
Nawaz的解决方案很好,但另一种选择是模板成员函数:
template<typename T>
unsigned Scene::addActor()
{
_actors.push_back(new T());
}
然后在客户端代码中:
scene.addActor<Hero>();
值得注意的是,模板成员函数需要在头文件(例如.inl)包含的头文件或文件中实现。如果直接在类体中实现它,则不应在addActor()前面编写Scene ::。
此方法的一个优点是客户端不会调用new。如果代码调用new,它通常是“坏的”,但是不调用delete,在这种情况下,删除可能会在稍后由Scene类调用。如果出于性能原因需要使用自定义分配器,这也会产生一个夹点。
答案 2 :(得分:0)
为什么不创建一个pv类Clonable
:
template <typename T>
struct Clonable {
virtual smart_ptr<T> clone() const = 0;
}
smart_ptr
为std::shared_ptr
,std::unique_ptr
,boost::shared_ptr
等。
关键是要重新计算指针以避免使用手动delete
,除非在编写自定义Deleter
时。
然后将Actor
定义为:
class Actor : ..., public Clonable<Actor> {
...
public:
...
virtual smart_ptr<T> clone() const { return 0; }
...
...
}
然后,对于T : public Actor
,
scene.addActor((T()).clone());