TN016: c + + ´ÙÁß »ó¼ÓÀ» »ç¿ë ÇÏ ¿© MFC¿Í ÇÔ²²

ÀÌ ³ëÆ®¿¡¼­´Â ´ÙÁß »ó¼Ó (MI) Microsoft Foundation Ŭ·¡½º¿Í ÇÔ²² »ç¿ë ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù¡£

¿Ö ´ÙÁß »ó¼Ó?

³» Áý °ª c + + ¹× °´Ã¼ ÁöÇâ Ä¿¹Â´ÏƼ¿¡ Áö¼ÓÀûÀÎ ³íÀïÀÌ ÀÖ´Ù. Visual c + + ÄÄÆÄÀÏ·¯¿Í °³¹ß ȯ°æ ¹Ì¸¦ ¿Ïº® ÇÏ °Ô Áö¿ø¡£

MFC Ŭ·¡½º ¶óÀ̺귯¸® ¼³°è µÇ¾ú½À´Ï´Ù MFC¸¦ »ç¿ë ÇÏ ¿© ¸¶ÀÏÀ» ÀÌÇØÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ¹Ì½Ã°ÇÀº MFC Ŭ·¡½º¿¡¼­ »ç¿ë µÇÁö ¾Ê½À´Ï´Ù. ¿ì¸® ¹Ì Ŭ·¡½º ¶óÀ̺귯¸®¸¦ ÀÛ¼º ÇÏÁö ¾Ê¾Æµµ ¾øÀ¸¸ç ±×°Í ½É°¢ÇÑ ÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼º Çϱâ À§ÇÑ ÇÊ¿äÇÑ °ÍÀ¸·Î ³ªÅ¸³µ½À´Ï´Ù. ¹Ì »ç¿ë ¼ö °³ÀÎ °áÁ¤, ±×·¡¼­ ¿ì¸®´Â ´ç½Å¿¡ °Ô ±× °áÁ¤À» µÎ°í¡£

±×·¡¼­ ´ç½ÅÀÌ »ç¿ë ¹Ì?

¹Ì¸¦ »ç¿ë ÇÏ ¿© ¼º´É Àå´ÜÁ¡À» ÀÌÇØ ÇÏ °í MFC¸¦ »ç¿ë ÇÏ´Â ¹æ¹ýÀ» ÀÌ¹Ì ¾Ë°í ÀÖ´Ù¸éÀÌ technote¸¦ ¼öÇà ÇØ¾ß ÇÕ´Ï´Ù ¸»ÇÒ °Í ÀÌ´Ù. Á¦ÇÑ »çÇ× Áß ÀϺδ ÀϹÝÀûÀÎ c + + Á¦ÇÑ, ´Ù¸¥ MFC ¾ÆÅ°ÅØÃ³¿¡ ÀÇÇØ ºÎ°ú µÈ´Ù.

´ÙÀ½ ÀϺÎÀÇ ¹Ì ÀϹÝÀûÀÎ MFC °ü¿ë±¸ÀÇ »ç¿ë¿¡ ¹ÌÄ¡´Â ¿µÇâÀÇ ±â¼úÀûÀÎ ¹®Á¦ ¼³¸í ÇÕ´Ï´Ù. ¸¶ÀÏÀ» »ç¿ë ÇÏ ¿© ¿ÏÀü ÇÑ MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Æ÷ÇÔ µÇ¾î ÀÖ´ÂÀÌ ±â¼ú ³ëÆ®ÀÇ ³¡¿¡ ÃßÃâ ¼ö ¹× ÄÄÆÄÀÏ¡£

CRuntimeClass

²ö±â¿Í MFCÀÇ µ¿Àû °³Ã¼ »ý¼º ¸ÞÄ¿´ÏÁò CRuntimeClass µ¥ÀÌÅÍ ±¸Á¶¸¦ »ç¿ë ÇÏ ¿© Ŭ·¡½º¸¦ °íÀ¯ ÇÏ °Ô ½Äº° ÇÕ´Ï´Ù. MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ °¢ µ¿Àû ¹×/¶Ç´Â serializable Ŭ·¡½º¿Í ÀÌ·¯ÇÑ Á¾·ùÀÇ ÇϳªÀÇ ±¸Á¶¸¦ ¿¬°áÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±¸Á¶´Â AFX_CLASSINITÇü½ÄÀÇ Æ¯º° ÇÑ Á¤Àû °³Ã¼¸¦ »ç¿ë ÇÏ ¿© ÀÀ¿ë ÇÁ·Î±×·¥ ½ÃÀÛ ½Ã ÃʱâÈ­ µË´Ï´Ù. ´ç½ÅÀÌ ÇÊ¿ä °ÆÁ¤ ÇÏÁö ÀÚ½ÅÀÌ Á¤º¸ ±¸ÇöÀ¸·Î MFCÀÇ ¹öÀü °£¿¡ º¯°æ µÉ °¡´É¼ºÀÌ¡£

ÇöÀç ±¸ÇöÀÇ CRuntimeClass ´ÙÁß »ó¼Ó ·±Å¸ÀÓ Çü½Ä Á¤º¸¸¦ Áö¿ø ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ¶æ ¹Ì MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù ÀÖÁö¸¸ µÑ ÀÌ»óÀÇ ±âº» Ŭ·¡½º °³Ã¼¿¡¼­ ÀÛ¾÷ÇÒ ¶§ ƯÁ¤ Ã¥ÀÓÀ»°¡Áö°í °ÍÀÔ´Ï´Ù ÇÒ °æ¿ì,¡£

CObject::IsKindOf ¸â¹ö ÇÔ¼ö¸¦ ¿Ã¹Ù¸£°Ô È®ÀÎ ÇÏÁö °³Ã¼ÀÇ Çü½ÄÀ» ¿©·¯ ±âº» Ŭ·¡½º¿¡ ÀÖ´Â °æ¿ì. µû¶ó¼­, CObject °¡»ó ±âº» Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù ±×¸®°í ¸ðµç È£ÃâÀÌ Serialize ¹× »õ·Î¿î ¿¬»êÀÚ ¿Í °°Àº ¸â¹ö ÇÔ¼ö°¡ CObject ´Â c + +¿¡´Â ÀûÀý ÇÑ ÇÔ¼ö È£Ãâ ¸íÈ®È÷ ±¸ºÐ ¼ö ÀÖµµ·Ï ¹üÀ§ ÇÑÁ¤ÀÚ¸¦ °¡Á®¾ß ÇÒ °Í ÀÌ´Ù. MFC ³»¿¡¼­ ¹Ì¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ¸¸é ´ÙÀ½ ÇØ¾ß CObject ±âº» Ŭ·¡½ºÀÇ ±âº» Ŭ·¡½º ¸ñ·Ï¿¡¼­ °¡Àå ¿ÞÂÊ Å¬·¡½º¸¦ Æ÷ÇÔ Çϴ Ŭ·¡½º¸¦ ¸¸µé ¼ö¡£

¹ÌÀÇ ³²¿ë ¹× »ç¿ë¿¡ ´ë ÇÑ Á¶¾ð, °í±Þ c + + ÇÁ·Î±×·¡¹Ö ½ºÅ¸Àϰú ¼÷¾î James O. Coplien (¾Öµð½¼ ¿þ½½¸®, 1992)¸¦ ÂüÁ¶ ÇϽʽÿÀ.

CObject-¸ðµç Ŭ·¡½ºÀÇ ·çÆ®

¾Ë´Ù½ÃÇÇ, ¸ðµç Áß¿ä ÇÑ Å¬·¡½º CObjectŬ·¡½º¿¡¼­ Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀ¸·Î ÆÄ»ý µË´Ï´Ù. CObject ±¸¼º¿ø µ¥ÀÌÅÍ´Â ¾øÁö¸¸ ¸î °¡Áö ±âº» ±â´ÉÀ» °¡Áö°íÁö ¾Ê½À´Ï´Ù. ¸¶ÀÏÀ» »ç¿ë ÇÏ´Â °æ¿ì µÎ °³ ÀÌ»óÀÇ CObject¿¡¼­ »ó¼Ó¿¡ °øÅë µÉ °ÍÀÔ´Ï´Ù-ÆÄ»ý Ŭ·¡½º´Â CFrameWnd ¹× CObList:

cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
 ...
};
CListWnd myListWnd

ÀÌ °æ¿ì¿¡ CObject Æ÷ÇÔ µÇ¾î µÎ ¹ø, µÎ ¹®Á¦¿¡ À̸£°Ô:

±ÇÀå µÇ´Â ´Ü°è

ÆÄ»ý µÈ ±âº» Ŭ·¡½º¸¦ µÎ °³ ÀÌ»óÀÇ CObject °¡Áø »õ Ŭ·¡½º¸¦ ¸¸µå´Â °æ¿ì »ç¿ë ÇÏ´Â »ç¶÷µéÀ» ±â´ë ±× CObject ¸â¹ö¸¦ ´Ù½Ã ±¸Çö. »õ ¿¬»êÀÚ ¹× »èÁ¦ ´Â Çʼö, ¼ö ´ýÇÁ ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¿¹¸¦ µé¾î:

cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
°ø°³:
 nbsp;? void * new ¿¬»êÀÚ (size_t nSize)
 ?????? {¹Ýȯ CFrameWnd::operator new(nSize);}
 ?? void ¿¬»êÀÚ delete (void * p)
 ?????? {CFrameWnd::operator delete(p);}

void ´ýÇÁ (CDumpContent & dc)
 ?????? {CFrameWnd::Dump(dc);
 ???????? CObList::Dump(dc); }
 ??? ...
}

CobjectÀÇ °¡»ó »ó¼Ó?

¿äûÇÒ ¼ö ÀÖ½À´Ï´Ù "»ç½Ç»ó Cobject¸¦ »ó¼Ó ÇÏ´Â °æ¿ì ¾ÊÀ» ¸ðµç ¸ðÈ£¼º ¹®Á¦ ¶°³ª?"¡£

È¿À²ÀûÀÎ Microsoft °³Ã¼ ¸ðµ¨¿¡µµ °¡»ó »ó¼Ó (¸¶Âù°¡Áö·Î ´ÙÁß »ó¼ÓÀº °æ¿ì¿¡ µû¶ó ´ÜÀÏ »ó¼ÓÀ¸·Î È¿À²ÀûÀ¸·Î) ºñ °¡»ó »ó¼ÓÀ¸·Î È¿À²ÀûÀÔ´Ï´Ù. °¡»ó »ó¼Ó ÀÌÈÄ CObject¿¡ ¾ø´Â ±¸¼º¿ø µ¥ÀÌÅÍ, ±âº» Ŭ·¡½º ¸â¹ö µ¥ÀÌÅÍÀÇ ¿©·¯ º¹»çº»À» ¹æÁö Çϱâ À§ÇØ ÇÊ¿ä ÇÏÁö ¾Ê½À´Ï´Ù.

ÁøÂ¥ ´ë´äÀº ¾Æ´Ï, °¡»ó »ó¼Ó À§ÀÇ ±×¸² ¸ðÈ£¼º ¹®Á¦°¡ ÇØ°á µÇÁö °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é: ´ýÇÁ °¡»ó ¸â¹ö ÇÔ¼ö´Â ¿©ÀüÈ÷ ¸ðÈ£ (ÀÌÈÄ CFrameWnd ¹× CObList ´Ù¸£°Ô ±¸Çö)¡£

µû¶ó¼­ ÁÁ½À´Ï´Ù À§ÀÇ ´Ü°è¿¡ µû¶ó ¸íÈ®¼ºÀ» Á¦°ø Çϱâ À§ÇØ:

CObject::IsKindOf ¹× ·±Å¸ÀÓ ÀÔ·Â

CObject ¿¡¼­ MFC¿¡ ÀÇÇØ Áö¿ø µÇ´Â ·±Å¸ÀÓ ÀÔ·Â ¸ÞÄ¿´ÏÁò DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE IMPLEMENT_DYNCREATE, DECLARE_SERIAL , IMPLEMENT_SERIAL¸ÅÅ©·Î »ç¿ë ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¾ÈÀü ij½ºÆ® ´Ù¿î½º ¼ö ÀÖµµ·Ï ·±Å¸ÀÓ Çü½Ä °Ë»ç¸¦ ÇÒ ´É·ÂÀ» ÁÙ¡£

ÀÌ·¯ÇÑ ¸ÅÅ©·Î¸¸ ´ÜÀÏ ±âº» Ŭ·¡½º¸¦ Áö¿ø ÇÏ °í °öÇϱ⠻ó¼Ó µÈ Ŭ·¡½º¿¡ ´ë ÇÑ Á¦ÇÑ µÈ ¹æ½ÄÀ¸·Î ÀÛµ¿ ÇÕ´Ï´Ù. IMPLEMENT_DYNAMIC ¶Ç´Â IMPLEMENT_SERIAL ¿¡¼­ ÁöÁ¤ ÇÏ´Â ±âº» Ŭ·¡½º¿¡´Â ù ¹øÂ° (°¡Àå ¿ÞÂÊ) ±âº» Ŭ·¡½º À̾î¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î,

cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
 nbsp;? DECLARE_DYNAMIC(CListWnd)
 ?? ...
};
IMPLEMENT_DYNAMIC (CListWnd, CFrameWnd)(&N)

°Í¸¸À¸·Î °¡Àå ¿ÞÂÊ ±âº» Ŭ·¡½º¿¡ ´ë ÇÑ °Ë»ç¸¦ ÀÔ·Â ÇÒ ¼ö ÀÖ½À´Ï´Ù. ·±Å¸ÀÓ Çü½Ä ½Ã½ºÅÛ Ãß°¡ ±âÁö (CObList ÀÌ °æ¿ì)¿¡ ´ëÇØ ¾Æ¹«°Íµµ ¾Ë °Í ÀÌ´Ù¡£

CWnd ¹× ¸Þ½ÃÁö ¸Ê

MFC ¸Þ½ÃÁö ¸Ê ½Ã½ºÅÛ ¿Ã¹Ù¸£°Ô ÀÛµ¿ Çϵµ·Ï Çϱâ À§Çؼ­´Â, °Å±â¿¡ µÎ °³ÀÇ Ãß°¡ ¿ä±¸ »çÇ×:

À§ÀÇ ¿¹Á¦¿¡¼­ CFrameWnd ´Â ù ¹øÂ° ±âº» Ŭ·¡½ºÀÔ´Ï´Ù.

ÀÛµ¿ ÇÏÁö ¾Ê´Â ¸î °¡Áö ¿¹:

cTwoWindows Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CEdit
 nbsp;? { ... };
 ?????? / / ¿À·ù: CwndÀÇ µÎ º¹»çº»

CListEdit Ŭ·¡½º: °ø¿ë CObList, °ø°ø CEdit
 ?? { ... };
 ?????? / / ¿À·ù: CEdit (Cwnd¿¡¼­ ÆÄ»ý) ù ¹øÂ° ¿©¾ß ÇÕ´Ï´Ù(&N).

¸¶ÀÏÀ» »ç¿ë ÇÏ ¿© »ùÇà ÇÁ·Î±×·¥

´ÙÀ½ ¿¹Á¦´Â CFrameWnd CWinApp¿¡¼­ ÆÄ»ý µÈ Ŭ·¡½ºÀÇ ±¸¼º µÈ µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î ÀÀ¿ë ÇÁ·Î±×·¥À» ±¸Ãà ±ÇÀå, ÇÏÁö¸¸ ÀÌ°Ç ÇϳªÀÇ Å¬·¡½º¿Í ÀÛÀº MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¿¹¡£

´ÙÀ½ ÇÁ·Î±×·¥À» Àß¶ó³»¾î HELLOAPP »ó´Ü¿¡ º¹»çÇÒ ¼ö ÀÖ½À´Ï´Ù.´ÜÀÏ »ó¼Ó MFC ÀÏ¹Ý »ùÇÿ¡ CPP HELLOAPP. ´ç½ÅÀÌ Á¤»óÀûÀ¸·Î ÇÁ·Î±×·¥À» ±¸Ãà¡£

#include <afxwin.h>

class CHelloAppAndFrame : public CFrameWnd, public CWinApp
{ 
public:
    CHelloAppAndFrame()
        { }

    // Necessary evil for MI disambiguity
    void* operator new(size_t nSize)
        { return CFrameWnd::operator new(nSize); }
    void operator delete(void* p)
        { CFrameWnd::operator delete(p); }

// Implementation
    // CWinApp overrides
    virtual BOOL InitInstance();
    // CFrameWnd overrides
    virtual void PostNcDestroy();
    afx_msg void OnPaint();

    DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(CHelloAppAndFrame, CFrameWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

// since the frame window is not allocated on the heap, we must
// override PostNCDestroy not to delete the frame object
void CHelloAppAndFrame::PostNcDestroy()
{
    // do nothing (do not call base class)
}

void CHelloAppAndFrame::OnPaint()
{
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(rect);

    CString s = "Hello, Windows!";
    dc.SetTextAlign(TA_BASELINE | TA_CENTER);
    dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
    dc.SetBkMode(TRANSPARENT);
    dc.TextOut(rect.right / 2, rect.bottom / 2, s);
}

// Application initialization
BOOL CHelloAppAndFrame::InitInstance()
{
    // first create the main frame
    if (!CFrameWnd::Create(NULL, "Multiple Inheritance Sample",
        WS_OVERLAPPEDWINDOW, rectDefault))
        return FALSE;

    // the application object is also a frame window
    m_pMainWnd = this;          
    ShowWindow(m_nCmdShow);
    return TRUE;
}

CHelloAppAndFrame theHelloAppAndFrame;

±â¼ú ³ëÆ® ¹øÈ£·Î |nbsp; Ä«Å×°í¸®º° ±â¼ú ³ëÆ®(&N)

Index