C++ C++;多态性与新关键字

C++ C++;多态性与新关键字,c++,pointers,polymorphism,C++,Pointers,Polymorphism,有没有办法根据传递的指针类型分配内存 我的问题是:我有一个“BounchBall”和“hero”类,它们都继承自“Actor”。要添加弹跳球,我调用: _actors.push_back(new Bouncyball()); 对于英雄来说,这将是: _actors.push_back(new Hero()); 由于_actors是Actor指针的向量,它的工作原理是多态性。但我想编写一个通用方法,将新演员添加到场景中: unsigned Scene::addActor(Actor * act

有没有办法根据传递的指针类型分配内存

我的问题是:我有一个“BounchBall”和“hero”类,它们都继承自“Actor”。要添加弹跳球,我调用:

_actors.push_back(new Bouncyball());
对于英雄来说,这将是:

_actors.push_back(new Hero());
由于_actors是Actor指针的向量,它的工作原理是多态性。但我想编写一个通用方法,将新演员添加到场景中:

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

因为参数可以是Actor的任何导数,所以我不知道为什么分配内存。。。我可以用一个案例陈述来解决这个问题,但是如果我以后再派生其他参与者呢?

这有什么错:

unsigned Scene::addActor(Actor * actor){
    this->_actors.push_back(actor);
    //what do you want to return? why not make return type as void?
}
您不是要添加到
\u actors
中的
actor

您可以调用
addActor()
,如下所示:

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

确保将
Actor
的析构函数声明为
virtual
,因为您很可能希望通过基类型的指针(即
Actor
)删除派生类对象。

这有什么问题:

unsigned Scene::addActor(Actor * actor){
    this->_actors.push_back(actor);
    //what do you want to return? why not make return type as void?
}
您不是要添加到
\u actors
中的
actor

您可以调用
addActor()
,如下所示:

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

确保将
Actor
的析构函数声明为
virtual
,因为您很可能希望通过基类型的指针(即
Actor
)删除派生类对象。

Nawaz的解决方案很好,但另一种方法是模板成员函数:

template<typename T>
unsigned Scene::addActor()
{
   _actors.push_back(new T());
}
模板
未签名的场景::addActor()
{
_演员。推回(新T());
}
然后在客户端代码中:

scene.addActor<Hero>();
scene.addActor();
值得注意的是,模板成员函数需要在头文件或包含在头文件(如.inl)中的文件中实现。如果直接在类主体中实现,则不应在addActor()前面编写Scene::


这种方法的一个优点是客户端不调用new。如果代码调用new,但不调用delete,则通常是“不好的”,在这种情况下,场景类稍后可能会调用delete。如果出于性能原因需要使用自定义分配器,这也会产生一个临界点。

Nawaz的解决方案很好,但另一种选择是模板成员函数:

template<typename T>
unsigned Scene::addActor()
{
   _actors.push_back(new T());
}
模板
未签名的场景::addActor()
{
_演员。推回(新T());
}
然后在客户端代码中:

scene.addActor<Hero>();
scene.addActor();
值得注意的是,模板成员函数需要在头文件或包含在头文件(如.inl)中的文件中实现。如果直接在类主体中实现,则不应在addActor()前面编写Scene::


这种方法的一个优点是客户端不调用new。如果代码调用new,但不调用delete,则通常是“不好的”,在这种情况下,场景类稍后可能会调用delete。如果出于性能原因需要使用自定义分配器,这也会产生一个临界点。

为什么不创建一个pv类
Clonable

template <typename T>
struct Clonable {
    virtual smart_ptr<T> clone() const = 0;
}
然后,对于
T:public Actor


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

为什么不创建一个pv类
Clonable

template <typename T>
struct Clonable {
    virtual smart_ptr<T> clone() const = 0;
}
然后,对于
T:public Actor


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

我返回实际代码中创建的参与者的索引。这个解决方案非常简单:)谢谢!我返回实际代码中创建的参与者的索引。这个解决方案非常简单:)谢谢!