핵심 부분만 간추려서 적어 놓았다.
아래 코드는 컴파일시도하지 않는 코드이다.
아래 가이드 코드를 작성하기 전에 ( 방금전에 ) 리플렉션 코드를 완성하고 테스트를 마친상태에서 정리한 것이다.
regist는 클래스를 선언할때 등록이 되며, getClass는 클래스가 필요할때 아무데서나 불러쓸수 있다.
이 c++ 리플렉션의 장점은 해당 클래스가 필요할지라도 getClass를 부를 때 ConcreteA.h 를 포함하지 않고
SuperVisor.h파일만 포함하고 있으면 해당 클래스를 가져다 쓸수 있다.
이 리플렉션을 활용하면 클래스간의 커플링이 제거된다.
// super
class Object;
// without implement class.
class ConcreteA;
class ConcreteB;
// factory
class CreateBase
: public Object
{
public: ...
public: virtual Object* Create() = 0;
}
template < class Conrete >
class CreateImpl
: public CreateBase
{
public: ...
public: virtual Object* Create() { return Concrete; }
}
// class resource management
class SuperVisor
{
static bool Regist( const char* name, Object* pObj )
{
map.add( name, pObj );
}
static Object* GetClass( const char* name )
{
Object* pCreator = map.get( name )
return pCreator->Create();
}
}
// macro
#define Regist( obj ) SuperVisor::Regist( #obj, new obj() )
#define GetClass( obj ) SuperVisor::GetClass( #obj )
/*
* Regist() macro will be used the page of .cpp file of implment class.
*/
// using.
Regist( ConcreteA );
Regist( ConcreteB );
Object* A = GetClass( ConcreteA );
Object* B = GetClass( ConcreteB );
'소프트웨어 공학 > 개발' 카테고리의 다른 글
vim-go 이용한 golang 개발환경 구축 (0) | 2019.01.29 |
---|---|
[Env] 라즈베리파이 - 라즈비안 설치 및 환경설정 (0) | 2018.04.11 |
우리는 직장인, 프로그래머란 자부심은 집에 두고 출근한다. (0) | 2012.02.15 |
개발하다가.. 미운 사람 있으면 써 보세요 ^^;; (0) | 2011.12.27 |
svn: Item is not readable (아이템이 읽기 불가능합니다) 해결 (0) | 2011.11.08 |