Re: [問題] template一問
先感謝各位前輩的幫忙
小弟看過各位的範例之後
匯整了一下
還請各位幫我看看這樣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
06/19 21:46, 1F
推
06/19 22:07, , 2F
06/19 22:07, 2F
→
06/19 22:07, , 3F
06/19 22:07, 3F
推
06/19 22:12, , 4F
06/19 22:12, 4F
→
06/19 22:12, , 5F
06/19 22:12, 5F
→
06/19 23:33, , 6F
06/19 23:33, 6F
→
06/19 23:33, , 7F
06/19 23:33, 7F
討論串 (同標題文章)