我猜我以前曾经问过几个类似的问题,但我在丛林中跳动。我认为这是我不能放松的真正问题。处理无法实例化对象的最佳方法?
我正在处理一个third party library,有一个对象无法创建自己b2Body
。 b2World
必须instantiate it。我个人不太喜欢这种设计模式;我认为b2Body
应该能够独立于世界而存在,然后在需要时加入世界。无论如何,我已将b2Body
与我自己的班级Body
包装在一起,因为无论如何我都需要添加一些额外的东西。同样,我有一个World
包装。现在,我想我有3种选择:
- 有无
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
没有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)
,该号码调用b2Body::b2Body()
并返回b2Body
,但从未呼叫Body::Body(args)
这是一个问题。 b2Body
会得到完全初始化,但我的包装没有地方做它的事情...更具体地说,我会怎么写World::CreateBody(const BodyDef &bd)
?假设BodyDef继承自b2BodyDef,来自b2Body的Body,来自b2World的World等等。
我认为这是一个完全合法的设计问题,不需要CW。 – djna 2009-09-27 07:52:39
哦,好吧......我比答案更感兴趣的答案......我忘了答案也无法获得代表。哎呀。 – mpen 2009-09-27 18:03:41