[回到版面]
回應模式
名 稱
E-mail
標 題
內 文
附加圖檔[] []
刪除用密碼(刪除文章用。英數字8字元以內)
  • 可附加圖檔類型:GIF, JPG, PNG, JPEG,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 10000 KB。當回文時E-mail填入sage為不推文功能
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 程式碼可使用 [code][/code] 以 google-code-prettify 標亮 (程式自動判斷語言類別)

  • 公告、舉報、建議請向DB管理室辦理。
  • 本板討論遊戲製作為主,改造方面也可討論,但如果牽涉到版權,請自重。
  • 3D建模請至3D板, 3D遊戲製作(Ex.怎麼用DirectX跑3D?)則可在這討論。
  • 本板為一般向板面,禁止張貼上車圖。

檔名:1467184174718.png-(2 KB, 408x41) [以預覽圖顯示]
2 KB無標題 名稱: 無名氏 [16/06/29(三)15:09 ID:O5nrJAAM] No.12131  
想請教程式問題 針對串鏈連結 我用C++實作
1.
在串鏈的時候 有個data與next指向下一個節點
但我data的型態如果有一堆 class,struct 用指標指過去等等

這不就代表 我要重複寫很多類似的程式碼 只因為存的型態不同
包括插入 取出等等的實作都要再寫一次
想知道這樣是很正常的 還是有針對多型有更聰明的做法?

2.
我有真的某個怪物所設定的class MonsterA;
裡面有著HP,ATK
但今天我有新的數值SP 這代表我要開個child class先繼承MonsterA的參數
把它叫做MonsterB

可是這樣我問題又來了 同一個串鏈不就也無法儲存兩種不同的類別

//
這兩個問題主要都是 我想動態儲存 地圖上生成的怪物資料
但如果一開始不定好參數 事後要用子類別定義 卻又不知道如何串起
使否我一開始的思路就有問題 想尋求解答
其實比較應該去程設板 名稱: 無名氏 [16/06/29(三)15:28 ID:RVpTtR1s] No.12132 2推  
1.
鏈結串列的性質之一就是實作很麻煩
如果你有很多型態不相容的東西要做串列
可以考慮使用template重複利用程式碼

2.
C++所謂的「多型(polymorphism)」特色
指的就是virtual function
class Monster{
 virtual int getSP()=0;
 };

class MonsterA:public Monster{
 int getSP(){return 0;}
 };

class MonsterB:public Monster{
 int getSP(){return sp;}
 int sp;
 };

int main()
 {
 Monster *a=new MonsterA();
 Monster *b=new MonsterB(10);
 printf("MonsterA SP : %d\n",a->getSP());
 printf("MonsterB SP : %d\n",b->getSP());
 delete a;
 delete b;
 }
//以上程式碼省略不重要的部份,不能直接編譯、僅供參考


一個父類別的指標可以指向子類別
當你用這個父類別型態的指標呼叫他的virtual function時
他會自動偵測那個類別真正的型態、呼叫到對應的成員函式
對同樣用Monster的指標儲存的A、B兩隻怪物詢問SP值
其中一個會呼叫到沒有SP的怪物的版本,也就是直接告訴你SP為0
另一個則會真的取得自己的SP值並回傳
無名氏: 認真推一個 (IiTT0C7s 16/06/29 21:08)
無名氏: 在子類別的virtual函式後面加個override是個好習慣,可以省去驗證覆寫的麻煩 (S0FtqGy. 16/07/01 13:04)
無標題 名稱: 無名氏 [16/06/29(三)22:30 ID:O5nrJAAM] No.12135   
>>No.12132
左邊列表有程設版嗎?找不到才跑來這邊的
多謝回答 受益良多

關於template也有些疑問
template<typename T>
class Node{
Node<T>* previous;
Node<T>* next;
T data;
};

關於template網路上查到都是以上這種
都是基本的資料型態 int,double等等

但我節點的資料想要存class,struct
templata能否使用這些型態
不能的話 一般串多種不同資料也只能每種重新寫一份了?
還是我對於節點的想法錯了?
無標題 名稱: 無名氏 [16/06/30(四)00:21 ID:yhS2Sx6M] No.12136 4推  
>>No.12135
>>左邊列表有程設版嗎?
電腦網路
電腦
Pixmicat!
Joyful Note
>>程設交流<<
網頁設計
Apple


>>templata能否使用這些型態
當然可以
只要是型態,地位就是相同的
不管是基本型態、指標、類別、函式指標、還是更複雜的東西
通通都能用

不過你的Node有個小問題
通常template裡面會用T *data而不是T data
用指標的話你可以在外面new出來再餵給Node
可以自由使用任何一種方法取得實體
但直接在Node裡用實體的話,你必須在初始化Node的同時也初始化data
這發生在Node的初始化列表,data的建構函式參數也是在那邊指定
但是Node的建構函式是所有型態共用的,初始化列表也是
於是你必須在初始化列表上填入讓所有型態的data都有辦法呼叫建構函式的參數
通常就是零參數
也就是你未來每個餵給Node的類別都必須要有零參數的建構函式,而且只有它會被呼叫到

...不小心講太多了
總之請把T data改成T *data
雖然對基本型態來說這樣會比較麻煩一點
但為了未來用在class上時能省掉不少困擾,還是得這樣改
厡PO: Σ(゚д゚)只拿程式當關鍵字搜尋 難怪找不到 (rUnYFKSY 16/06/30 12:00)
原PO: 多謝解答 (rUnYFKSY 16/06/30 12:00)
無名氏: 將數值當作引數的Template,一旦收到non-extern的數值就不行了,不過這情況可能罕見 (S0FtqGy. 16/07/01 14:09)
無名氏: 解答GJ !!! (S0FtqGy. 16/07/01 14:12)
無標題 名稱: 無名氏 [16/07/01(五)14:24 ID:S0FtqGy.] No.12141 2推  
1.
原Po真的想要實踐能存放不定個數type的鍊節串列的話,
那麼std::tuple組件跟Varadic Templatem語法的搭配
可滿足你深沉的渴望,甚至連多型可能也不需要了

https://www.youtube.com/watch?v=R1G3P5SRXCw&list=PLHTh1InhhwT75gykhs7pqcR_uSiG601oh&index=15

這影片是Varadic Templatem說明,探討了它的優勢,以及缺點

2.
MonsterA直接繼承給MonsterB可能是糟糕的選擇,
會造成這兩個類別相互耦合(兩邊程式碼非各自獨立,這在日後修改會很頭痛),而且MonsterB可能繼承了用不到的東西,造成資源浪費,
MonsterA跟MonsterB最好要有個一致的共通介面,有了共通介面,A跟B就都能放進鍊節串列中,因為使用的介面相同...
這樣的好處是日後修改程式碼不會因太過耦合而改得要死,
在Monster出現的環境中只須對Monster下達命令就好,不用針對某Monster而寫出特殊實作的命令,MonsterA跟MonsterB的行為他們自己會負責...
這可用C++的抽象類別來達成

類別可視為某樣概念的實體,抽象類別可視為實體集合的共通概念
原PO: 也沒有很渴望拉 只是想了解C++能做到怎樣的程度 (49CJQLMY 16/07/02 18:56)
sage: 常常覺得某某功能 應該做的出來 語言不會這麼笨之類的 (49CJQLMY 16/07/02 18:57)

【刪除文章】[]
刪除用密碼:
第一頁[0] 最後一頁