2009-08-30 3 views
2
#ifdef _DEBUG 
    #define new DEBUG_NEW 
    #undef THIS_FILE 
    static char THIS_FILE[] = __FILE__; 
#endif 

왜 이러한 태그를 정의합니까?이 C++ 코드 스 니펫은 무엇을합니까?

CSortHeaderCtrl::CSortHeaderCtrl() 
    : m_iSortColumn(-1) 
    , m_bSortAscending(TRUE) 
{ 
} 

콜론을 사용한 후 두 기능은 무엇입니까?

BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CHeaderCtrl) 
    //{{AFX_MSG_MAP(CSortHeaderCtrl) 
     // NOTE - the ClassWizard will add and remove mapping macros here. 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

이와 비슷한 C# 같은 것들이 있습니까?

이 용도는 무엇입니까?

virtual ~CSortHeaderCtrl(); 

왜 소멸자 기능을 가상으로 설정합니까?

void CSortHeaderCtrl::Serialize(CArchive& ar) 

이 기능은 언제 호출됩니까?

부모로부터 연장 되었습니까?

그런데 MFC 클래스를 확장하려면 어떤 문서를 읽을 것입니까?

우리는 어떤 기능을 가지고 있는지 모르기 때문에 어떤 기능을 대체 할 수 있습니까? 질문 2에 관해서는

/* File: SortHeaderCtrl.h 

    Purpose: Provides the header control, with drawing of 
      the arrows, for the list control. 
*/ 

#ifndef SORTHEADERCTRL_H 
#define SORTHEADERCTRL_H 

#if _MSC_VER > 1000 
    #pragma once 
#endif // _MSC_VER > 1000 

class CSortHeaderCtrl : public 
CHeaderCtrl { // Construction public: 
    CSortHeaderCtrl(); 

    // Attributes public: 

    // Operations public: 

    // Overrides  // ClassWizard generated 
    virtual function overrides 
     //{{AFX_VIRTUAL(CSortHeaderCtrl) 
     public:  virtual void Serialize(CArchive& ar); 
     //}}AFX_VIRTUAL 

    // Implementation public:  virtual 
    ~CSortHeaderCtrl(); 

    void SetSortArrow( 
     const int iColumn, 
     const BOOL bAscending); 

     // Generated message map functions 
    protected:  
     void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 

     int m_iSortColumn;  
     BOOL m_bSortAscending; 

     //{{AFX_MSG(CSortHeaderCtrl)   // 
     NOTE - the ClassWizard will add and 
     remove member functions here. 
     //}}AFX_MSG 

    DECLARE_MESSAGE_MAP() }; 

//{{AFX_INSERT_LOCATION}} // Microsoft 
Visual C++ will insert additional 
declarations immediately before the 
previous line. 

#endif // SORTHEADERCTRL_H 
+0

무효 CSortHeaderCtrl :: 직렬화 (CArchive & AR) 때이 함수가 호출됩니다? 이게 부모에게서 연장 된거야? 그런데 MFC 클래스를 확장하려면 어떤 문서를 읽어야합니까? 우리는 어떤 기능을 가지고 있는지 모르기 때문에 어떤 기능을 무시할 수 있습니까? 누구든지이 마지막 질문에 대답합니까? 감사합니다. – MemoryLeak

답변

2

왜 이러한 태그를 정의합니까?

jcopenha의 답변을 참조하십시오.

콜론을 사용한 후 두 기능은 무엇입니까?

피터의 대답을 참조하십시오.

이와 비슷한 C#이 있나요? 이게 뭐야?

C#에서는 위임자 사전으로 구현 될 수 있습니다.

"메시지 맵"(이는 아마도 MFC Library Reference Message Handling and Mapping의 하위 섹션 중 하나에 설명되어 있음)이라고합니다.

내용은 일반적으로 IDE "클래스 마법사"(코드/텍스트 편집기를 사용하여 수동으로 편집하지 않음)를 통해 작성/편집됩니다.

왜 소멸자 기능을 가상으로 설정합니까? 클래스가 서브 클래스화할 수있는 경우

C++에서 다음 소멸자는 거의 항상 (가상해야이 가상하지 그리고 당신은 슈퍼 클래스에 대한 포인터를 삭제하여 그것을 호출, 그렇지 않은 경우 때문에, 서브 클래스의 소멸자는 않을 것 호출된다).

이 기능은 언제 호출됩니까?

아마도 여기에 설명되어 있습니다 : MFC Library Reference Serialization in MFC.

이것은 부모로부터 확장 한 것입니까?

난 그냥 위의 준 링크 주문에 따라, 그것은 CObject의 조상 클래스는 다음과 같습니다. "MFC 공급 장치가 내장 클래스 CObject에서 직렬화에 대한 지원 따라서, CObject에서 파생 된 모든 클래스는 CObject의 직렬화 프로토콜을 활용할 수 있습니다. "

그런데 MFC 클래스를 확장하려면 어떤 문서를 읽을 것입니까?

MFC 참조 문서.

우리가이 기능을 알고하지 않기 때문에 우리가 어떤 기능을 재정의 할 수 있습니다 ...

당신은 일반적으로 모든 것을 오버라이드 (override) 할 수있는 가상 및 개인 없습니다. IDE에 내장 된 클래스 마법사를 사용할 수도 있습니다.

CSortHeaderCtrl은 분명히 제 3 자 클래스이지만 Microsoft 클래스는 아닙니다. 아마도 저자/공급 업체가 그것을 사용하기로되어 있다면 일부 문서를 썼습니다.

+0

와우, 놀랍습니다. – MemoryLeak

3

:

다음은 헤더 파일입니다 사람들은 기능하지 않습니다. CSortHeaderCtrl의 멤버는 initializer lists입니다. 클래스회원을 위해 만 복사 생성자 (대신 처음의 호출되기 때문에,

m_iSortColumn = -1; 
m_bSortAscending = TRUE; 

나는 "그것을 생각"강조 : 당신은에 해당되는 로 생각할 수 있습니다 복사 생성자와 할당 연산자).

이니셜 라이저리스트와 상기 초기화 순서 이 기록 된 순서에 의해 결정되지 않고, 참고하지만, 클래스 상속 순서 의해 상기 부재 변수 선언의 순서에 의해.

+0

감사합니다. 다른 사람은 어떤가요? – MemoryLeak

+0

죄송합니다. 나는 그들 모두에게 대답 할 수 없으며 질문 1과 질문 3은 이미 다른 사람들에 의해 답변되었습니다. –

+0

void CSortHeaderCtrl :: Serialize (CArchive & ar) 이 함수는 언제 호출됩니까? 이게 부모에게서 연장 된거야? 그런데 MFC 클래스를 확장하려면 어떤 문서를 읽어야합니까? 우리는 어떤 기능을 가지고 있는지 모르기 때문에 어떤 기능을 무시할 수 있습니까? – MemoryLeak

6

질문 1 : DEBUG_NEW는 아마도 'new'연산자가 메모리 누수 감지에 도움이되도록 블록이 할당 된 위치와 시간에 대한 추가 정보를 기록하기 때문에 this을 참조하십시오. THIS_FILE [] 정적 문자 배열 simple은 현재 'new'디버그에서 사용되는 파일 이름을 유지합니다.

질문 2 : C++ 초기화 목록입니다.

질문 3 : 소멸자는 다른 가상 멤버가 있기 때문에 가상으로 선언되며 파생 클래스입니다. '삭제'연산자는 삭제할 객체의 올바른 크기를 알 필요가 있습니다. this

2

우선 CSortHeaderCtrl은 C + +에서 가상 소멸자를 가지고 있기 때문에, 소멸자 가상.

소멸자는 기본 클래스에서 가상 클래스로 만들어 지는데 이는 기본에서 파생 된 클래스의 소멸자가 호출되기 때문입니다.

파생 클래스의 소멸자가 호출되지 않은 경우 (즉, 기본 클래스 소멸자가 가상이 아닌 경우) 메모리를 누설하고 리소스 (스트림, 핸들 등)를 열어 둘 가능성이 높습니다.

게시 한 나머지 코드는 Win32 메시지를 클래스 또는 창에 대한 멤버 함수에 매핑하는 것과 같이 일반적인 또는 중복 MFC 작업을 처리하기 위해 Visual Studio에서 생성됩니다. 이 코드는 오버라이드 될 가능성이 있거나 코드를 중단하고 디버깅 관련 두통이 오는 방식이므로이 코드를 만져서는 안됩니다.

관련 문제