我想我以前问过一些类似的问题,但我是在拐弯抹角。我认为这是我不能完全休息的真正问题。
我正在处理第三方库,并且有一个无法自行创建的对象b2Body
。b2World
必须实例化它。我个人不是很喜欢这种设计模式;我认为b2Body
应该能够独立于世界而存在,然后在需要时添加到世界中。无论如何,我已经b2Body
用我自己的类包裹了Body
,因为无论如何我都需要向它添加一些额外的东西。同样,我有一个World
包装器。现在我想我有 3 个选项:
- Have
Body
的构造函数需要一个指针,World
以便它可以被完全实例化(b2World::CreateBody
在内部某处调用)——即有一个像这样的构造函数Body *b = new Body(world_ptr)
- 传递
Body
给一些World::CreateBody
方法,比如图书馆已经这样做了——即Body *b = world.CreateBody(params);
- 复制所有数据,
b2Body
以便您可以随心所欲地使用它,然后在将其添加到世界后,它将“切换”以使用b2Body
数据 - 即Body b
以后world.addBody(b)
。
(1)和(2)意味着你不能Body
没有 a World
,我可能不需要,但有这个选项可能会很好[这样我就可以将它用作其他对象的模板等]。不知道还有什么其他优点和缺点。(3) 看起来更好,但要实现的工作量要多得多,这意味着我必须复制b2Body
.
你怎么认为?我CW
会这样做,这样没人会担心。
我仍然不能让这一切安息。这是每个选项的样子:
选项1:(我更喜欢)
World w;
Body b;
Fixture f;
b.addFixture(f);
w.addBody(b);
选项2:(中间某处)
World w;
Body b(w);
Fixture f(b);
选项 3:(Box2D 是如何做到的)
World *w = new World;
Body *b = w->CreateBody(args);
Fixture *f = b->CreateFixture(args);
选项 2 和 3 差别不大,但它改变了谁可以控制创建对象。
我将如何实际实施选项 3?World::CreateBody()
必须调用b2World::CreateBody(args)
which 调用b2Body::b2Body()
并返回b2Body
但从不调用Body::Body(args)
which 是一个问题。将b2Body
被完全初始化,但我的包装器没有地方做它的事情......更具体地说,我将如何写World::CreateBody(const BodyDef &bd)
?假设 BodyDef 继承自 b2BodyDef,Body 继承自 b2Body,World 继承自 b2World,等等。