作者NIKE74731 (做遊戲的心)
看板C_and_CPP
標題Re: [問題] template一問
時間Sun Jun 19 14:32:59 2011
先感謝各位前輩的幫忙
小弟看過各位的範例之後
匯整了一下
還請各位幫我看看這樣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)
推 angleevil:<m.m> 謝謝你讓我多學幾招. 06/19 21:46
推 legnaleurc:template 要包成 DLL 是有難度的 ... 06/19 22:07
→ angleevil:=..=c++的OO真是難 06/19 22:07
推 legnaleurc:因為 template 在具現化之前不會生成任何 code 06/19 22:12
→ legnaleurc:沒有 object code 就不能做 DLL ... 06/19 22:12
→ NIKE74731:主要還是copy L大的方法 只是把lambda expression改成我 06/19 23:33
→ NIKE74731:會的 C++0x我根本就不懂也不會用 Orz 06/19 23:33