C ++多态性和新关键字

时间:2012-02-18 07:39:39

标签: c++ pointers polymorphism

是否有某种方法可以根据传递的指针类型分配内存?

这是我的问题:我有一个'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会怎么样?

3 个答案:

答案 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_ptrstd::shared_ptrstd::unique_ptrboost::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());