我猜我以前曾經問過幾個類似的問題,但我在叢林中跳動。我認爲這是我不能放鬆的真正問題。處理無法實例化對象的最佳方法?
我正在處理一個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