作者dwight90488 (陳佳佳)
看板C_and_CPP
標題[問題] 繼承與聚合
時間Fri Oct 20 00:14:17 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
Win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
C++
問題(Question):
想請問大大們 繼承與聚合的建構方式
Class:樂器 聚合 Class:樂器規格(InstrumentSpec)
------------------------------ <------ -------------------------------
成員:序號(string) 型號(string)
價格(double) 材質(string)
樂器規格(InstrumentSpec)
^ ^
| |
| 繼承 | 繼承
| |
Class:吉他 聚合 Class:吉他規格(GuitarSpec)
------------------------------ <------ -------------------------------
吉他規格(GuitarSpec) 弦數(int)
樂器的constructor: 樂器(string 序號, double 價格, InstrumentSpec 樂器規格);
樂器規格的constructor: 樂器規格(string 型號, string 材質)
吉他規格的constructor: 吉他規格(string 型號, string 材質, int 弦數)
這時候我就有點困惑有關於吉他的contructor的撰寫方式
這是我目前想到可行的建構子
吉他的contructor: 吉他(string 序號, doble 價格, GuitarSpec 吉他規格)
:樂器(序號, 價格, 吉他規格),吉他規格(吉他規格)
這樣建構是正確的嗎? 感覺樂器initializer的規格那部分可以移掉,
畢竟後面吉他規格已經有初始化到了....
還是有正確的建構方式呢? 先謝謝您們的回答了!!!!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.159.95
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1508429660.A.8B0.html
※ 編輯: dwight90488 (1.163.159.95), 10/20/2017 00:15:08
1F:→ PkmX: 你這樣guitar裡面會有兩個獨立的*Spec成員 10/20 00:21
2F:推 z1976: 因為樂器規格是動態型別,所以建議用指標 10/20 02:33
3F:→ z1976: 用智慧型指標不用管理delete 10/20 02:33
4F:推 legendmtg: 為什麼你的GuitarSpec要繼承InstrumentSpec? 10/20 12:07
5F:→ dwight90488: 因為很多樂器規格是共有的 所以GuitarSpec我也繼承了 10/20 12:08
6F:推 legendmtg: 不是有共同的屬性就要繼承啊 是取決於你要怎麼操作 10/20 13:58
7F:推 legendmtg: 兩個改法 1. GuitarSpec不要繼承InstrumentSpec 10/20 14:01
8F:→ legendmtg: 2. 吉他不要有GuitarSpec 直接用樂器的InstrumentSpec 10/20 14:02
9F:→ legendmtg: 指標指向GuitarSpec物件 10/20 14:03
10F:→ dwight90488: 謝謝以上各位的回答 Legendmtg大大說的沒錯 10/20 20:05
11F:→ dwight90488: 我仔細想了之後 好像不是必要繼承的 我可以把 10/20 20:06
12F:→ dwight90488: guitarSpec當成是 吉他規格是跟樂器相比多出來的屬性 10/20 20:07
13F:→ y3k: 借文問一下 這樣的Case在CPP用template寫有跟Java、C#一樣便 10/21 16:58
14F:→ y3k: 利嗎@@ 最近剛開始從那兩個進到這裡來... 10/21 16:58
15F:→ uranusjr: 就這個 case 來講用 template 就和 generics 差不多 10/21 18:25