看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《littletempo (小天普)》之銘言: : 請教一下眾位高手 : 一個關於class中成員函數的問題 : 假如我今天想要定義一個 戰士(warrior) 作 攻擊(attack) 與 移動(move) : (以下code皆為想像,意會用,並不符合syntax) : 寫了一個Warrior class : class Warrior { : void Warrior(); : void attack(); : void move(); : } : 此時 attack 與 move 並沒有定義如何實作 : 這些函數的定義是寫在其他地方的 : attack可能有很多種 ex: 1. 射箭(bow) : 2. 用矛刺(spear) : 3. 用斧劈(axe) : move也可能很多種 ex: 1. 跑(run) : 2. 跳(jump) : 3. 走(walk) : 有沒有可能在初始 Warrior 時才告訴他應該怎麼做 : 例如像這樣: : Warrior Jack(bow, run); : Jack.attack(); // Jack 射箭 : Jack.move(); // Jack 跑 : 如果上面可以辦到 : 更進一步,是否在執行程式中改變行為,例如: : Jack.move = jump : Jack.move(); // Jack 跳 : 這樣子的要求不太可能用單純的Virtual與繼承作 : 例如 : class RunBowWarrior : public Warrior{} : 因為如果變化很多就要寫很多種derived class了(例如上例9種)。 : 想請教各位有沒有什麼方法可以達成呢? : 感謝大家!! 如果你的程式不會很龐大的話, 可以考慮 switch + Enumeration 的作法 , 優點就是存取資料成員會比較方便, 但缺點是可能更新了列舉的數目但 swtich 裡的 case 並沒有做出對應的修改: http://codepad.org/UiO1i4W3 想要比較好擴充的話, 可以選用「策略模式」, 不過相對應要付出比較多 的執行時間: 推文中 james732 大的程式碼略作修改 http://codepad.org/OPEIREGI 另外推文中 legnaleurc 大的方法, 我想實作起來應該像這樣: http://codepad.org/3aA7eVmi -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
james732:就等你這篇 XDDD 01/20 10:29
james732:為什麼我老是忘了有auto_ptr可以用....XD 01/20 10:31
littletempo:這篇好讚! 研究研究! 01/20 11:36
xatier:推l大用心 01/20 14:06
VictorTom:推, l大就甘心:D 01/20 15:24
sunneo:天啊..天啊.. 這寫法真方便遷移到別的語言XD 01/20 16:05
james732:啊,我剛剛都沒推到,補個推 01/20 16:08
legnaleurc:如果攻擊類別不變的話,單純的switch會很簡單:P 01/20 16:52
有沒有 C# 的 fu? XD ※ 編輯: loveme00835 來自: 140.121.197.115 (01/20 19:57)
flashphp:昨天我就在揉眼睛,想說是走到C#板了嗎,原來l大是故意的XD 01/21 10:00