2014-04-01 29 views
0

假設我有兩種不同類型的對撞機,圓形和方框,它們派生自相同的基本對撞機類。我有一個實體類,其中包含一個指向對撞機的指針,該對象可以是圓形對撞機或箱式對撞機。處理不派生類的細節

class Collider {}; 

class CircleCollider : public Collider 
{ 
    // Defines a circle 
}; 
class BoxCollider : public Collider 
{ 
    // Defines a rectangle 
}; 

class Entity 
{ 
    Collider* collider; 
}; 

我想打一個衝突處理,我可以只傳遞了一堆的實體,讓它找出如何解決他們的衝突,但爲了做到這一點的處理程序需要知道它是什麼類型的對撞機處理。

當問題被框住喜歡這個,唯一的解決方案似乎是向下傾斜,但我想知道我是否只是接近它錯誤的方式。這似乎是一種常見的情況,但我無法找到解決方案,這讓我懷疑是否有其他方法,我沒有看到,或者這是一個只需要使用向下轉換的情況。

由於碰撞處理是特定於不同的碰撞對,它似乎並沒有在這裏使用訪問者模式,或者我錯了嗎?

+1

聽起來像是教科書的雙重派遣 - 參見http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C.2B.2B –

+0

請參見[Double dispatch](http://en.wikipedia.org/wiki/Double_dispatch)如果每對對象需要不同的行爲。如果每個對象碰撞的都不重要,那麼@ Straw1239下面的解決方案就可以了。 – jsantander

+0

雙派遣看起來像我正在尋找,但不知道名稱,謝謝。 – Freegor

回答

1

如果您向Collider類添加了一個虛擬方法collidesWith(Collider c),並在BoxCollider和CircleCollider中添加了特定的實現方法,那麼這些特定實例是否會發生碰撞,外部衝突處理程序將永遠不會宕機,知道它使用什麼特定類型的對撞機。

+0

我最初的想法是沿着這些線路解決它,但你仍然需要知道這兩個碰撞器的類型來解決這種情況下需要向下轉換傳遞的碰撞器的碰撞。似乎要求每種類型的碰撞器知道所有其他碰撞器的效率比讓處理器做到這一點效率低。或者我錯過了什麼? – Freegor