2012-02-18 52 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());