2013-06-12 42 views
6

這是一個關於如何實現我最近一直需要的一些問題的問題。我確信這有一個模式或共同的解決方案,即使我已經有了一個,我渴望瞭解更多。具有不同參數的派生類中的C++方法

假設我工作的遊戲中所有與遊戲本身相關的實體都是從「演員」類(如「障礙物」,「移動障礙物」,「子彈」和「大炮」)派生而來的。在遊戲中,所有這些實體都存儲在一個std::vector<Actor *>矢量中,以便它們可以遍歷。

現在,讓我們假設每個「演員」在每回合可以「做」什麼,讓我們給他們一個方法,「行爲」。 Obstacle :: act會做的很少,Moving_obstacle :: act和Projectile :: act會移動它們並且「Cannon :: act」會創建一個新的子彈。這有點很有意義的純虛函數演員::行事,所以我又可以做這樣的事情:

std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end(); 
while(b < e) 
{ 
    *b->act(); 
    b++; 
} 

,並讓他們所有的「演技」。那麼,迄今爲止這麼好......事情是,Cannon :: act可以有不同的原型或返回值(例如,存儲一個生成的拋射體,並將它放入向量中),而這個「小」差異打破了一切。

現在,我知道,從某些觀點來看這些方法重載各自完全不同的功能。我也知道,人們總是可以提前計劃並以足夠的遠見來解決問題......或者只能解決問題。

在這種情況下就在眼前,我只是用不同的獨特identificators每個派生Actor類,用它們轉換爲對應的類做的工作他們周圍。我相信我會再次遇到同樣的問題,我很想知道一些入門級解決方案。

提前感謝您的時間。

+0

牆少,更多的示例代碼,請 – David

+3

不能同意@戴夫,這是一個很好想出了問題。 – Nick

+0

您可能需要查看[訪問者模式](http://en.wikipedia.org/wiki/Visitor_pattern)。 – Nick

回答

3

開始是聲音沒有得到,你出軌這裏:

的事情是,大炮::行爲可能有不同的原型或返回值(例如,存儲生成的拋射物並將其推入載體中)

爲什麼呢?法是行爲。實例必須弄清楚沒有其他任何東西。在行動之前,你應該訓練它或者其他的電話。或者在法令召集期間環視四周。

考慮:即使你有神奇的準備不同PARAMS有效載荷,在報價時會是怎樣想通了?電話是抽象的。即使你通過一些dynamic_cast來感染它,仍然留下哪些炮會得到哪些參數?

沒有,主體必須相互配合,或使用一些消息系統(參見調度)...文本

+0

消息傳遞系統就是我在另一個項目中使用的。結束了過於複雜 - 可能是不好的實現 - 所以我去嘗試一些不同的東西......我注意到deraling(很多,每次我看代碼),但從來沒有想過用其他方法進行訓練。在未來的項目中會給它一些想法。謝謝。 –

+0

標記爲答案。不是說任何評論都沒有幫助,但「行爲是行爲」有點真的讓我受益。僅供參考,我拆除了整個錯誤繼承,並在遊戲控制器和Actor子類中寫入了不同的方法,以處理每個特定情況(拍攝,移動其他演員或其他任何東西)。使用whats_my_type_id方法在類之間辨別是醜陋的,但對於這個項目來說足夠遠。 –

1

內部變量,每個行爲的主體是不同的,他們可以使用內部民營/或繼承的變量,因此,如果您可以在調用行爲之前設置這些變量,所以你不需要通過送什麼參數是安全的,或者併發症

+0

感謝您的回覆......事情是,想象一下,我想添加一個新的「子彈」:嗯,我應該從某個地方返回它,或者傳遞一個引用/指針給我寫入......我假設我可以做它沒有問題,但再次,我最終會static_casting「演員」類,所以我可以調用這些準備方法。有關於此的任何想法? –

+0

你可以讓所有的基類都有一個指針參數,只有感興趣的實例可以使用,並且發送一個null,給那些不需要發回任何東西的地方, – aah134

+0

這就是我在「Cannon」類中實際使用的。它會在成功觸發時寫入指針,然後主控制器會檢查指針中是否有東西,以便它可以插入到Actor矢量中......不過,我還需要更多類型的參數。謝天謝地,我已經解決了它:見上面的評論。 –

相關問題