Re: [問題] template一問

看板C_and_CPP作者 (做遊戲的心)時間14年前 (2011/06/19 06:33), 編輯推噓3(304)
留言7則, 3人參與, 最新討論串6/9 (看更多)
先感謝各位前輩的幫忙 小弟看過各位的範例之後 匯整了一下 還請各位幫我看看這樣implement是否有什麼缺點 #include "stdafx.h" #include <iostream> #include <map> class D { public: virtual void Run() = 0; }; class D1 : public D { public: D1() { std::cout << "D1 Init" << std::endl; } virtual void Run() { std::cout << "Run D1" << std::endl; } }; class D2 : public D { public: D2() { std::cout << "D2 Init" << std::endl; } virtual void Run() { std::cout << "Run D2" << std::endl; } }; class D3 : public D { public: D3() { std::cout << "D3 Init" << std::endl; } virtual void Run() { std::cout << "Run D3" << std::endl; } }; typedef D* (*TypeDefNewDPtr)(); template < class T > D* NewDerived() { return new T; } class FactoryS { public: static bool Register( const int& iKey, TypeDefNewDPtr fMethod ) { std::map< int, TypeDefNewDPtr >::iterator it = m_CreateMethod.find( iKey ); if( it != m_CreateMethod.end() ) return false; m_CreateMethod[ iKey ] = fMethod; return true; } static D* Get( int input ) { std::map< int, TypeDefNewDPtr >::iterator it = m_CreateMethod.find( input ); if( it == m_CreateMethod.end() ) return NULL; return it->second(); } static std::map< int, TypeDefNewDPtr > m_CreateMethod; }; std::map< int, TypeDefNewDPtr > FactoryS::m_CreateMethod; #define REGISTER_LM( iKey, fMethod ) FactoryS::Register( (iKey), (fMethod) ); void main() { REGISTER_LM( 1, NewDerived<D1> ); REGISTER_LM( 2, NewDerived<D2> ); REGISTER_LM( 3, NewDerived<D3> ); while( true ) { int input ; std::cin >> input; if( input == 0 ) break; D* p = FactoryS::Get( input ); if( !p ) continue; p->Run(); delete p; } system( "pause" ); } 想法上是將實體化子類別的方法以資料的型式存起來 根據user的input去map裡面找到對應的func ptr 這樣一來在一開始的時候記憶體裡面並沒有子類別的實體 可在runtime時再根據input來即時產生 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.159.34 ※ 編輯: NIKE74731 來自: 218.160.159.34 (06/19 14:33)

06/19 21:46, , 1F
<m.m> 謝謝你讓我多學幾招.
06/19 21:46, 1F

06/19 22:07, , 2F
template 要包成 DLL 是有難度的 ...
06/19 22:07, 2F

06/19 22:07, , 3F
=..=c++的OO真是難
06/19 22:07, 3F

06/19 22:12, , 4F
因為 template 在具現化之前不會生成任何 code
06/19 22:12, 4F

06/19 22:12, , 5F
沒有 object code 就不能做 DLL ...
06/19 22:12, 5F

06/19 23:33, , 6F
主要還是copy L大的方法 只是把lambda expression改成我
06/19 23:33, 6F

06/19 23:33, , 7F
會的 C++0x我根本就不懂也不會用 Orz
06/19 23:33, 7F
文章代碼(AID): #1D_PWUzH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1D_PWUzH (C_and_CPP)