看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 問題(Question): 請問各位 現在小弟遇到一個問題 請看以下 class Base { public: virtual void Run() = 0; }; class D1 : public Base { public: void Run() { std::cout << "Run D1"; } }; class D2 : public Base { public: void Run() { std::cout << "Run D2"; } }; class D3 : public Base { public: void Run() { std::cout << "Run D3"; } }; Base* Get( int iType ) { switch( iType ) { case 1: return new D1; break; case 2: return new D2; break; case 3: return new D3; break; } } 像這種東西在以後type增減的狀況下必須不斷對Get()做調整 請問有沒有什麼方法可以解決這種問題? 小弟有想到要用template的方式做 template< class T > class DerivedCreator { public: Base* Get() { return &m_DerivedObj; } T m_DerivedObj; }; 但原本的Base* Get(int iType)又該怎麼寫呢? Base* Get( int iType ) { // ???????????????????????? } template的type有辦法在runtime中當做參數傳進去嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.99.126
james732:我想到的是用工廠模式來寫,至少不用改 Get... 06/17 16:41
angleevil:我也認同james732所說,就算Base* Get( int iType ) 06/17 17:22
angleevil:可以依據你的推測去執行(搞不懂最後一句作用,因此不解 06/17 17:29
angleevil:讀),根據iType字眼,勢必還是要借助switch判斷. 06/17 17:30
angleevil:根據Function template(http://0rz.tw/lxUjz) 06/17 17:35
angleevil:以下方法可以參考看看 06/17 17:36
angleevil:template< class T > 06/17 17:36
angleevil:Base* Get( T tClass ) 06/17 17:36
angleevil:{ 06/17 17:37
angleevil:return &tClass; 06/17 17:37
angleevil:} 06/17 17:37
angleevil:直接把D3 產生的物件當參數丟入Get應該就可以 06/17 17:39
angleevil:ps:T tClass改成T &tClass,不過這想法應該有很多問題 06/17 17:40
angleevil:所以工廠模式參考看看吧,http://0rz.tw/hy9SD 06/17 17:42
※ 編輯: NIKE74731 來自: 59.124.99.126 (06/17 18:07)
loveme00835:Clone() + 陣列(連續) or map(不連續) 06/17 18:11
angleevil:查了一下c++的http://0rz.tw/D2iVa ,版主,此方法好像 06/18 13:45
angleevil:不怎麼保險呢 06/18 13:45
loveme00835:= = 06/18 15:02