C++의 RTTI는 정말 편리하다.
프로그램 실행중에 변수의 자료형을 확인할 수 있으니 말이다.
RTTI는 C++ 표준서 및 MFC RTTI 지원 문서를 참고하자.
C++ RTTI : http://sweeper.egloos.com/2826160
MFC RTTI : http://anster.egloos.com/2173004
그런데 써본 사람들은 알겠지만, 이 MFC의 RUNTIME_CLASS() 매크로는 속도도 빠르고 좋은데
문제는 내포 클래스(혹은 중첩 클래스라고 말하기도 한다)에는 사용할 수 없다.
내포 클래스란...? http://initial4-blog.blogspot.kr/2012/06/c-study-512-part.html
내포 클래스는 용도에 따라서 매우 유용한 클래스인데, 이런 내포(중첩)클래스에서도 RTTI를 사용할 수 있도록 MFC의 RUNTIME_CLASS를 약간 수정해 보았다.
IMPLEMENT_DYNAMIC_NESTED() 의 사용방법은 다음과 같다.
=> nesting_class는 내부 클래스를 감싸는 외부 클래스
=> class_name은 외부 클래스 안에 있는 내포 클래스 즉, 중첩 클래스
=> base_class_name은 내포 클래스 즉, 중첩 클래스가 상속하고 있는 부모 클래스.
아래는 사용 예를 보여준다.
---------------- 헤더파일에 추가할 내용 ----------------
#define RUNTIME_CLASS_NESTED(nesting_class, class_name) ((CRuntimeClass*)(&nesting_class::class_name::class##class_name)) #if _MSC_VER >= 1600 #define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\ CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \ { return RUNTIME_CLASS_NESTED(nesting_class, class_name); } \ CRuntimeClass* PASCAL nesting_class::class_name::GetThisClass() \ { return RUNTIME_CLASS_NESTED(nesting_class, class_name); } #else #define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\ CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \ { return RUNTIME_CLASS_NESTED(nesting_class, class_name); } #endif #ifdef _AFXDLL #define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \ CRuntimeClass* PASCAL nesting_class::class_name::_GetBaseClass() \ { return RUNTIME_CLASS(base_class_name); } \ AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \ #class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \ &nesting_class::class_name::_GetBaseClass, NULL }; \ IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name) #else #define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \ AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \ #class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \ RUNTIME_CLASS(base_class_name), NULL }; \ IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name) #endif #define IMPLEMENT_DYNAMIC_NESTED(nesting_class, class_name, base_class_name) \ IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, 0xFFFF, NULL)
---------------- 사용하는 방법 예제 ----------------
A.h
class CA : public CObject { public: DECLARE_DYNAMIC(CA) CA(){} virtual ~CA(){} private: class CANested : public CObject { public: DECLARE_DYNAMIC(CANested) CANested() {} virtual ~CANested() {} }; };
A.cpp
IMPLEMENT_DYNAMIC(CA, CObject) IMPLEMENT_DYNAMIC_NESTED(CA, CANested, CObject)
'I ♥ Programming' 카테고리의 다른 글
델파이에서 Windows7용 소리 조절(XP 동시지원) 클래스(볼륨 믹서) (0) | 2014.05.03 |
---|---|
프로그램에 C+0 Lamda 표현식을 사용하자. 아주 조으다. (0) | 2014.04.29 |
로딩하는 움직이는 GIF 모음 (loading animated gif) (0) | 2014.04.04 |
C++ 모니터 꺼짐(화면보호기) 방지 기능 추가하기 (0) | 2014.04.02 |
VS 2010 원격 디버깅 (0) | 2014.02.13 |