2012-02-18 62 views
0

是否有某种方式来分配内存取决于传递的指针类型?C++多态性和新的关键字

这是我的问题:我有一个'弹跳球'和'英雄'类都从'演员'继承。要添加bouncyball,我称之为:

​​

对于一个英雄,那就是:

_actors.push_back(new Hero()); 

由于_actors是演员指针的载体,它的作品,因为多态性。但我想编写一个通用的方法,以新的角色加入到我的场景:

unsigned Scene::addActor(Actor * actor){ 
    this->_actors.push_back(new [something]); 
} 

因为参数可以是演员的任何衍生产品,我不知道是什么,为...我可以解决分配内存这与一个案例陈述,但如果我后来从其他派生演员呢?

回答

3

什么是错的:

unsigned Scene::addActor(Actor * actor){ 
    this->_actors.push_back(actor); 
    //what do you want to return? why not make return type as void? 
} 

是不是要添加到_actorsactor

你可以叫addActor()为:

scene.addActor(new Bouncyball()); 
scene.addActor(new Hero()); 

确保您申报Actor的析构函数virtual,因为很有可能你会想通过基本类型的指针删除派生类对象(这是Actor)。

+1

我在实际的代码返回所创建的演员的索引。这个解决方案非常简单:)谢谢! – soulfreshner 2012-02-18 08:02:38

2

谢里夫的解决方案是好的,但另一种是一个模板成员函数:

template<typename T> 
unsigned Scene::addActor() 
{ 
    _actors.push_back(new T()); 
} 

然后在客户端代码:

scene.addActor<Hero>(); 

值得一提的是,模板成员函数需要在包含头文件的头文件或文件(例如.inl)中实现。如果直接在类体中实现它,则不应在addActor()前写入Scene ::。

此方法的一个优点是客户端不会调用新的。如果代码调用new,但不调用delete,则通常'不好',在这种情况下,delete可能稍后会被Scene类调用。如果出于性能方面的原因需要使用自定义分配器,这也会产生一个小问题。

0

为什么不产生PV类Clonable

template <typename T> 
struct Clonable { 
    virtual smart_ptr<T> clone() const = 0; 
} 

smart_ptr为被std::shared_ptrstd::unique_ptrboost::shared_ptr等 要点是的refcount指针,以避免使用手册delete秒,写入时除外自定义Deleter

然后定义Actor为:

class Actor : ..., public Clonable<Actor> { 
... 
public: 
    ... 
    virtual smart_ptr<T> clone() const { return 0; } 
    ... 
... 
} 

然后,T : public Actor

scene.addActor((T()).clone());