GPG 5권에 나오는 내용으로 런타임 상에서 해당 오브젝트의 타입 정보를 알아낼수 있는 기능입니다.

제가 사용한 용도로는 객체 리스트를 들고 있는데, 이 객체들이 하나는 로직컬 객체고 다른 하나는 렌더러블 객체라 할 때, 이 둘을 분류 하기 위해서 어느 방법이 좋을까 고심하다 (물론 다른 방법도 많겠지만 ) 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::flyweight m_strClassName;
};

CRTTI 정적 멤버 변수로 클래스 타입 고유의 ID 역할을 합니다. 이 멤버 변수가 같다면, 같은 클래스 타입이라 할 수 있습니다.  IsClassOf 함수에서는 해당 객체가 해당 클래스인지 판별을 하고, IsKindOf 함수에서는 해당 객체의 부모 클래스 타입을 검색해 어느 클래스로 부터 파생 되었는 지를 판별할 수 있습니다.

+ Recent posts