티스토리 뷰

목차

    반응형

    기본적인 자료형 변환 형태는 DYNAMIC_DOWNCAST (Class, Pointer)입니다. 클래스 등 형 변환이 정상적으로 이루어질 경우 해당 오브젝트의 포인터를 반환하고, 그렇지 않다면 NULL을 반환합니다.


    아래는 간단한 type casting 예제 3개입니다.


    C++ 캐스팅 자료형 변환 예 1)


    1
    2
    3
    CFrameWnd* pParent;
    CWnd* pNaturalParent = pPrintView->GetParentFrame();
    pParent = DYNAMIC_DOWNCAST(CFrameWnd, pNaturalParent);
    cs


    C++ 캐스팅 자료형 변환 예 2)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class X:public CObject
    {
         public:
              int x;
              DECLARE_DYNCREATE(X)
    };
    IMPLEMENT_DYNCREATE(X, CObject)
     
    class Y:public X
    {
         public:
              int y;
              DECLARE_DYNCREATE(Y)
    };
    IMPLEMENT_DYNCREATE(Y, X)
     
    Y* pY=new Y;
    X* pX=DYNAMIC_DOWNCAST(X, pY);
     
    delete pY;
    cs


    C++ 캐스팅 자료형 변환 예 3)


    1
    2
    3
    4
    CMDIFrame-xWnd* pFrame;
    pFrame = DYNAMIC_DOWNCAST(CMDIFrame-xWnd, AfxGetMainWnd());
     
    pFrame = (CMDIFrame-xWnd*) AfxGetMainWnd(); // () 안에 캐스팅 타입을 선언
    cs

    또한, 다른 예를 들어, XXX *pointer를 선언하여 실제 값을 얻고 싶다면 아래처럼 사용하시면 됩니다.


    1
    A* p = DYNAMIC_DOWNCAST(A, pointer);
    cs


    정상적으로 C++ 자료형 변환이 이뤄지면 변환 객체의 포인터를 얻게 되지만, 실패할 경우 NULL을 얻게 됩니다.

    그리고 하나 더 살펴볼 것은, CRuntimeClass와 IsKindOf의 관계입니다.


    MFC에서 동적으로 사용되는 클래스를 위한 것으로 타겟 클래스의 변수로 인스턴스를 올바르게 가리키는지 확인하는 데 꼭 필요합니다.


    c++ dynamic_downcast 자료형 변환 캐스팅type casting 예제


    아래는 동적으로 클래스 객체를 캐스팅하여 반환하는 예입니다.


    1
    2
    3
    BOOL CObject::IsKindOf(   
           const CRuntimeClass* pClass  
                   ) const;
    cs


    CFramwWnd에 클래스를 생성하는 경우, 사용자가 선언한 멤버 함수에 이를 대입하기 위해서 CRuntimeClass가 사용됩니다.


    아래는 더욱 더 상세한 type casting C++ 예제입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <afxwin.h>
     
    class Type1: public CObject {};   // CObject에서 파생
    class Type2: public CFrameWnd {}; // CFrameWnd에서 파생
     
    BOOL IsType1(CObject *pFrameWnd)  // 확인 함수
    {
         return pFrameWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd)); 
    }
    BOOL IsType2(CObject *pObject)
    {
        return pObject->IsKindOf(RUNTIME_CLASS(CObject));
    }
     
    int main()
    {
         Type1 t1;
         Type2 t2;
     
        ASSERT(IsType1(&t1) == FALSE);
        ASSERT(IsType1(&t2) == TRUE); 
     
        ASSERT(IsType2(&t1) == TRUE);
        ASSERT(IsType2(&t2) == TRUE); 
     
         return 0;
    }
    cs


    c++ dynamic_downcast 자료형 변환type casting 예제



    관련 글

    MFC 멀티바이트 유니코드 변환, Char <-> CString 형변환

    strchr, strrchr, strstr, strtok 멀티바이트 함수, 유니코드 변환

    C# string double 변환 7가지 방법과 재밌는 예제 소스 1개



    ⓒ written by vicddory

    반응형