構図を行うには、通常は優れていると継承を使いすぎないように。
通常、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(...));
}
};