我目前有一个“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(...));
    }
};

10-08 05:15