C++ C++;多态性与新关键字
有没有办法根据传递的指针类型分配内存 我的问题是:我有一个“BounchBall”和“hero”类,它们都继承自“Actor”。要添加弹跳球,我调用: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
_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())代码>我返回实际代码中创建的参与者的索引。这个解决方案非常简单:)谢谢!我返回实际代码中创建的参与者的索引。这个解决方案非常简单:)谢谢!