본문 바로가기
C++ 200제/코딩 IT 정보

C++ dynamic_downcast MFC 클래스 type casting 예제

by vicddory 2019. 4. 7.

기본적인 자료형 변환 형태는 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

댓글