RTTI

Code 2012. 8. 19. 21:13

RTTI (RunTime Type Information  또는  RunTime Type Indentification)
    - C++ 컴파일러 내에 포함되어 있는 기능으로서, 객체의 유형을 실행 시에 결정할 수 있도록 허용
    - 클래스를 동적으로 생성하고 이에 대한 정보를 얻음
    - RTTI 를 구현하기 위해 MS에서 CRuntimeClass를 만듬


http://www.winapi.co.kr/clec/cpp3/33-1-1.htm


* class##classname : ##의 의미는?

http://eslife.tistory.com/entry/define-%EB%A7%A4%ED%81%AC%EB%A1%9C-%ED%8C%81

‘##’ - Token-Pasting Operator (##): 분리되어 있는 2개의 토큰을 하나로 뭉쳐주는 역할을 합니다.

#define paster( n ) printf( "token" #n " = %d", token##n )


라고 할 때 아래와 같은 코딩은

int token9 = 9;

paster( 9 ); // token##n -> token 과실제인수9 를합쳐token9 가됨


  • CRuntimeClass 사용법   
        - 동적 클래스는 CObject를 베이스 클래스로 해야 한다.
    1. 동적클래스는 CRuntimeClass타입의 static 멤버를 가져야 한다.
    2. 선언된 static멤버를 초기화 : 클래스 이름, 크기..
    3. 동적클래스는 CObject*를 리턴하는 static CObject* CreateObject()함수를 선언해야 한다.
    4. static CreateObject()를 구현 : 클래스의 시작주소를 리턴


- 사용 매크로
DECLARE_DYNAMIC(class_name) : 1번
    - 동적 클래스 선언

IMPLEMENT_DYNAMIC(class_name) : 2번
    - 생성된 동적 클래스 초기화
    - IMPLEMENT_RUNTIMECLASS 호출

DECLARE_DYNCREATE(class_name) : 1번, 3번
    - DECLARE_DYNAMIC()을 호출
    - 추가적인 정적멤버 함수 CreateObject() 선언

IMPLEMENT_DYNCREATE(class_name) : 2번, 4번
    - IMPLEMENT_DYNAMIC()을 호출,CreateObject() 정의

DECLARE_SERIAL
    - DECLARE_DYNCREATE() 기능 +  직렬화 기능 제공

  •  RUNTIME_CLASS(class_name)   
        동적클래스의 CRuntimeClass* 를 반환
        생성자도 호출되기 전에 사용가능한 이유 : 동적클래스가 정적멤버를 가지고 있기 때문
        RUNTIME_CLASS(CMyObject)->CreateObject();
            의 경우와 new연산자를 사용하여 CMyObject개체를 만드는 것과는 차이가 없음
  •  DYNAMIC_DOWNCAST,  STATIC_DOWNCAST 의 차이
    DYNAMIC_DOWNCAST( class, pointer )는 특정 포인터를 원하는 클래스타입의 객체 포인터로 형변환하는 매크로
    pFrame = DYNAMIC_DOWNCAST( CMDIFrame-xWnd, AfxGetMainWnd() );
    는 pFrame = (CMDIFrame-xWnd*) AfxGetMainWnd(); 와 동일
    정상적인 형변환이 이루어지지 않을때 NULL을 반환

    http://pdalocal.paran.com/know/know_view.html?que=851267
    DYNAMIC_DOWNCAST STATIC_DOWNCAST 똑같은 일을 하는 매크로입니다.
    차이점 : DYNAMIC_DOWNCAST debug와 release 모드 모두에서 타입을 체크하지만
             STATIC_DOWNCAST debug 모드에서만 타입체크를 한다는 점입니다.
        그래서 DYNAMIC_DOWNCAST 타입체크가 실패하면 NULL 값을 리턴하지만
               STATIC_DOWNCAST는 ASSERT 일으킵니다.
    일반적 경우 STATIC_DOWNCAST을 권장
  • dynamic_cast
    RTTI 환경에서 자식클래스와 부모 클래스 간의 형변환
    http://www.winapi.co.kr/clec/cpp3/33-1-1.htm
    http://www.winapi.co.kr/clec/cpp3/33-2-3.htm
    http://blog.naver.com/skim01?Redirect=Log&logNo=20014776332
    http://kldp.org/node/1181
        - 추가 연구 대상 : typeid, static_cast, dynamic_cast, const_cast, reinterpret_cast




반응형

'Code' 카테고리의 다른 글

OEP 찾는 방법들  (0) 2012.08.19
UNICODE in Console  (0) 2012.08.19
pragma 정리  (0) 2012.08.19
Pointer Test  (0) 2012.08.19
GNU선언문  (0) 2012.08.19
Posted by codens