RTTI 구현2


기존(RTTI.html)의 RTTI 구현을 약간 수정하였다.

수정 사항은 다음과 같다.

1. std::string 대신 문자열 상수 사용
2. 변수명, 매크로 이름 수정

1. std::string 대신 문자열 상수 사용

매크로를 사용해서 RTTI를 선언 할 때 문자열을 넘겨 준다.
문자열 상수이기 때문에 소멸 되지 않는다.
그러므로 문자열 객체 대신 문자열 상수의 포인터를 저장하여 문자열 포인터를 저장한다.

MyRTTI 클래스에 상수 문자열 포인터를 선언한다.
const   char*   m_pcClassName;

2. 변수명, 매크로 이름 수정

클래스 이름: MyRTTI

사용되는 매크로:
MyDeclareRTTI - 헤더 파일에 MyRTTI  멤버 정의
MyImplementBaseRTTI - 소스에 부모가 없는클래스 이름 정의
MyImplementRTTI - 소스에 자신과 부모 클래스 이름 정의
MyImplementRTTI2 - 소스에 자신과 부모1, 부모2 이름 정의( 다중 상속 정의)

MySameClass - 두 객체가 같은 클래스인지 정의
MyDerivedFrom - 객체가 클래스로부터 상속 되었는지 검사한다.

사용 방법은 다음과 같다.

헤더 파일에

MyDeclareRTTI;

소스파일에 아래처럼 추가 한다.

MyImplementRTTI(CCallTaxi, CTaxi);

예제 소스를 한번 더 올린다.

#include <iostream>

#include "MyRTTI.h"

 

class CCar

{

    MyDeclareRTTI;

 

public:

    void Show() {    std::cout << "This is Car." << std::endl;  }

};

 

class CAirplane

{

    MyDeclareRTTI;

 

public:

    void Show() {  std::cout << "This is Airplane." << std::endl;  }

};

 

//달리고 날으는 택시... 있으면 좋겠다.

class CTaxi : CCar, CAirplane

{

    MyDeclareRTTI;

 

public:

    void Show() {    std::cout << "This is Taxi." << std::endl;  }

};

 

class CCallTaxi : CTaxi

{

    MyDeclareRTTI;

public:

    void Show()    {    std::cout << "This is CallTaxi." << std::endl;  }

};

 

class CBus : CCar

{

    MyDeclareRTTI;

public:

    char* m_str;

    void SetText(char * szText)

    {

        m_str = szText;

    }

    void Show() {   

        std::cout << m_str << std::endl;  

    }

};

 

 

MyImplementBaseRTTI(CCar);

MyImplementBaseRTTI(CAirplane);

MyImplementRTTI(CCallTaxi, CTaxi);

MyImplementRTTI2(CTaxi, CCar, CAirplane);

//const MyRTTI CTaxi::m_rtti ("CTaxi", 2, &CCar::m_rtti, &CAirplane::m_rtti);

MyImplementRTTI(CBus, CCar);

 

void main()

{

    CCar  car;

    CTaxi taxi;

    CAirplane airplane;

    CBus  bus;

 

    bus.SetText("abcdabcd");

    bus.Show();

 

    std::cout << car.GetRTTI().GetClassName() << "   *****   "  << airplane.GetRTTI().GetClassName() << std::endl;

 

    if (MyDerivedFrom(CCar, taxi))

        std::cout << "taxi Derived from CCar" << std::endl;

    if (MyDerivedFrom(CAirplane, taxi))

        std::cout << "taxi Derived from CAirplane" << std::endl;

    if (MyDerivedFrom(CAirplane, bus) == false)

        std::cout << "bus does not Derived from CAirplane" << std::endl;

}