GPG 5권에 나오는 내용으로 런타임 상에서 해당 오브젝트의 타입 정보를 알아낼수 있는 기능입니다.
제가 사용한 용도로는 객체 리스트를 들고 있는데, 이 객체들이 하나는 로직컬 객체고 다른 하나는 렌더러블 객체라 할 때, 이 둘을 분류 하기 위해서 어느 방법이 좋을까 고심하다 (물론 다른 방법도 많겠지만 ) RTTI를 적용해보기로 했습니다.
제가 사용하는 대략적인 소스 코드입니다.
CRTTI.h
CObject.h
CRTTI 정적 멤버 변수로 클래스 타입 고유의 ID 역할을 합니다. 이 멤버 변수가 같다면, 같은 클래스 타입이라 할 수 있습니다. IsClassOf 함수에서는 해당 객체가 해당 클래스인지 판별을 하고, IsKindOf 함수에서는 해당 객체의 부모 클래스 타입을 검색해 어느 클래스로 부터 파생 되었는 지를 판별할 수 있습니다.
제가 사용한 용도로는 객체 리스트를 들고 있는데, 이 객체들이 하나는 로직컬 객체고 다른 하나는 렌더러블 객체라 할 때, 이 둘을 분류 하기 위해서 어느 방법이 좋을까 고심하다 (물론 다른 방법도 많겠지만 ) RTTI를 적용해보기로 했습니다.
제가 사용하는 대략적인 소스 코드입니다.
CRTTI.h
class CRTTI { public: CRTTI( const tstring strClassName, const CRTTI* pBaseRTTI ); inline const tstring& GetClassName() const; inline const CRTTI* GetBaseRTTI() const; protected: const tstring m_strClassName; const CRTTI* m_pBaseRTTI; };
CObject.h
class CObject { public: CObject();; virtual ~CObject(); public: virtual const CRTTI* GetRTTI() const; public: static bool IsClassOf( const CRTTI* pRTTI, const CObject* pObject ); bool IsClassOf( const CRTTI* pRTTI ) const; static bool IsKindOf( const CRTTI* pRTTI, const CObject* pObject ); bool IsKindOf( const CRTTI* pRTTI ) const; public: static const ev_CRTTI ms_RTTI; const boost::flyweightm_strClassName; };
CRTTI 정적 멤버 변수로 클래스 타입 고유의 ID 역할을 합니다. 이 멤버 변수가 같다면, 같은 클래스 타입이라 할 수 있습니다. IsClassOf 함수에서는 해당 객체가 해당 클래스인지 판별을 하고, IsKindOf 함수에서는 해당 객체의 부모 클래스 타입을 검색해 어느 클래스로 부터 파생 되었는 지를 판별할 수 있습니다.