我目前有一个“WorldObject”类,其中包含一个指向其b2Body的指针以及一些方法和变量。
但是,使WorldObject成为b2Body的派生类会更聪明吗?
这类事情的一般方法是什么?要始终创建该类中最重要对象的派生类,还是仅创建一个新对象并赋予所有属性?
这些可能性的利弊是什么?
谢谢。
最佳答案
通常最好进行合成,而不要过度使用继承。
还要注意,您通常会创建一个调用b2World::CreateBody()
的正文,并返回一个b2Body*
,并且无法继承。
为了避免内部b2Body*
的生命周期出现问题,可以使用智能指针。我用这个定义:
class BodyDeleter
{
public:
BodyDeleter()
:m_world(NULL)
{}
BodyDeleter(b2World *world)
:m_world(world)
{}
void operator()(b2Body *body)
{
if (m_world)
m_world->DestroyBody(body);
}
private:
b2World *m_world;
};
typedef std::unique_ptr<b2Body, BodyDeleter> b2BodyPtr;
然后,在我的
WorldObject
中:class WorldObject
{
protected:
WorldObject(b2World *world)
:m_body(NULL, m_world)
{}
b2BodyPtr m_body;
};
然后,在
WorldObject
的实际子类中:class SpaceShip : public WorldObject
{
public:
SpaceShip(b2World *world)
:WorldObject(world)
{
//initialize bodydef and whatever
m_body.reset(world->CreateBody(...));
}
};