作者maxiwill (Maxiwill)
看板C_and_CPP
標題[問題] 關於繼承的問題
時間Sun Mar 21 12:10:42 2010
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
是這樣的, 假如我要用 C++ 撰寫一個程式, 來代表...
任何一個動物, 可以有任何的能力
那, 假設我是這樣定義 class 的 :
class animal
class dog : public animal
class cat : public animal
class rat : public animal
class ability
class fly : public ability
class walk : public ability
class eat : public ability
那我應該怎麼樣定義 animal 和 ability 的關係 ?
如果我要在 runtime 動態的把 ability 加裝到 animal 上
我該怎麼做 ?
我的想法是 animal HAS-A ability
亦即 :
class ability;
class animal {
private:
ability * p_ability[MAX_ABILITIES];
};
但是假設我定義了一個 ability
class attack : public ability
這樣 ability 會存取到 animal 吧 ?
這樣就會有問題了吧 ?
怎麼樣讓 ability 能夠也去動到 animal class ?
class animal {
private:
ability * P_abilities[MAX_ABILITIES];
};
如果說要用 forward declaration, 像這樣 :
class animal;
class ability {
private:
animal * target;
};
class animal {
private:
ability * p_ability[MAX_ABILITIES];
};
雖然說這樣會 work, 但如果 ability 和 animal 分開在不同的 header 檔裡面的話
compiler 就會要求我要定義清楚 class 的名稱
( 意思就是 compiler 找不到兩個 class )
這樣我該怎麼辦 @@
我想要把 animal, 和 class 寫在不同的標頭檔裡面, 而且標頭檔裡面不要 include
另一個標頭檔
我該怎麼做 ?
請各位前輩大大們解惑 XD
我找這相關的資料找兩個禮拜有了 = =
設計模式也有看了... @@
希望得到的正確結果:
程式跑出來的錯誤結果:
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
有問題的code: (請善用置底文標色功能)
補充說明:
--
命運硬要踩,但我拒絕死掉
我就是小強
小強是我的命
但其實交配繁殖子孫無限才是重點
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.125.46.244
※ 編輯: maxiwill 來自: 59.125.46.244 (03/21 12:14)
→ softwind:?不是就animal裡面放 fly/walk/eat這些virtual func即可? 03/21 22:25
推 loveme00835:這跟design pattern的策略模式有關 03/21 22:28
→ loveme00835:為了在執行時期改變行為, 這樣做會比較有彈性 03/21 22:29
→ aecho:ability比較像interface,而animal是implementation 03/21 22:32
→ softwind:state pattern 03/21 23:51