블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2024/5 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31



핵심 부분만 간추려서 적어 놓았다.

아래 코드는 컴파일시도하지 않는 코드이다.

아래 가이드 코드를 작성하기 전에 ( 방금전에 ) 리플렉션 코드를 완성하고 테스트를 마친상태에서 정리한 것이다.


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 );





: