Re: [語法] 關於製做一個new的選單

看板C_and_CPP (C/C++)作者 (Alien)時間16年前 (2010/03/16 01:54), 編輯推噓7(708)
留言15則, 9人參與, 最新討論串2/2 (看更多)
※ 引述《yan04870449 (楊伯)》之銘言: : 假如現在有一個父類別 A 同時被多個子類別所繼承,如A_a, A_b, A_c等.... : 接著我想要讓A* 依照傳進來的引數不同new成不同的子類別。 : 大概像下面這個樣子 : Class A : { : enum Type { a,b,c }; : }; : Class A_a : public A : {}; : Class A_b : public A : {}; : void Create( A::Type i_eType ) : { : switch( i_eType ) : { : case a : : A* = new A_a(); : break; : case b : : A* = new A_b(); : break; : } : } : 我想到的方法就像上面一樣,用switch去做類似選單的功能,可是 : 如果今天擁有的子類別很多的話感覺做起來不是很好,想請問板上 : 前輩有沒有這類的手法可以分享給小弟學習。 有推文說沒法避免 switch 一段。 其實方法一定有,當然要視乎你的情況 決定合不合用。 比如加入 design pattern 裡的 prototype pattern: (psuedo code) class A { public: enum Type {a,b,c}; virtual A* Clone() = 0; } class AFactory { private: std::map<Type, A*> prototypeMap; public: AFactory() { prototypeMap[a] = new A_a(.....); prototypeMap[b] = new A_b(.....); prototypeMap[c] = new A_c(.....); } A* CreateA( A::Type type} { return prototypeMap[type]->Clone(); } } 每個 child class 定義好自己的 clone logic, 這麼就不用一堆 switch-case。這種做法尤其 適合建立每種 child class 的方法都不同,又 很麻煩,child class 又會很常有增加的情況. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.77.15.243

03/16 01:56, , 1F
推....
03/16 01:56, 1F

03/16 02:23, , 2F
原來如此 真沒想到有map這招 受教了
03/16 02:23, 2F

03/16 02:37, , 3F
如果每個enum都配有自己的ctor 不是直接new一個就好?
03/16 02:37, 3F

03/16 05:51, , 4F
推推
03/16 05:51, 4F

03/16 07:46, , 5F
查表法?
03/16 07:46, 5F

03/16 10:11, , 6F
避免 new 的 cost 比較高的情況, clone 一個基本型就好
03/16 10:11, 6F

03/16 11:01, , 7F
3樓: 一來生成的不是 enum, 二來 enum 沒得加 ctor 吧?
03/16 11:01, 7F

03/16 11:02, , 8F
5樓:嚴格來說是 factory + 查表 + prototype
03/16 11:02, 8F

03/16 11:23, , 9F
不太瞭解程式記憶體怎麼配置 這樣不會比較浪費記憶體嗎
03/16 11:23, 9F

03/16 11:27, , 10F
還是說執行SWITCH的行為 每一個CASE也會都先NEW一個物件
03/16 11:27, 10F

03/16 15:25, , 11F
當然有比較浪費. 主要差在一開始要生成一系列的 "種".
03/16 15:25, 11F

03/16 15:26, , 12F
倒是一般來說這 overhead 並不太嚴重. 還有很多時候的
03/16 15:26, 12F

03/16 15:26, , 13F
pattern 都是以空間/效率換取可維護性. 值不值得就要自
03/16 15:26, 13F

03/16 15:27, , 14F
己判斷了
03/16 15:27, 14F

03/16 19:17, , 15F
受教了,感謝!!
03/16 19:17, 15F
文章代碼(AID): #1BddHdyD (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BddHdyD (C_and_CPP)