这些C ++代码片段有什么作用?

时间:2009-08-30 00:43:51

标签: c++ mfc

#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
#endif

为什么定义这些标签?

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类时,你会阅读哪个文档?

由于我们不知道它具有什么功能,我们可以覆盖哪些功能?

以下是头文件:

/* 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

5 个答案:

答案 0 :(得分:6)

问题1:DEBUG_NEW可能是这样的'new'操作符记录了一些额外的信息,这些信息有关块的分配位置和时间,以帮助检测内存泄漏,请参阅this。 THIS_FILE []静态字符数组simple保存当前文件名,可能由调试'new'

使用

问题2:这是一个C ++初始化列表。

问题3:析构函数被声明为虚拟,因为还有其他虚拟成员,这是派生类。 'delete'操作符需要知道要删除的对象的正确大小,以及要调用的实际析构函数,请参阅this

答案 1 :(得分:3)

关于问题2:那些不是功能。对于CSortHeaderCtrl的成员,它们是initializer lists。你可以把它想象成 相当于:

m_iSortColumn = -1;
m_bSortAscending = TRUE;

我强调“想到它”,因为成员 classes ,只调用复制构造函数(而不是第一个) 复制构造函数,然后是赋值运算符)。

注意,使用初始化列表,初始化顺序 不是由它所写的顺序决定的,而是由顺序决定的 类继承和成员声明的顺序 变量

答案 2 :(得分:2)

首先,CSortHeaderCtrl有一个虚拟析构函数,因为在C ++中,将析构函数设置为虚拟是正确的做法。

析构函数在基类中是虚拟的,因为它意味着将调用从基类派生的类中的析构函数。

如果未调用派生类中的析构函数(即基类析构函数是非虚拟的),那么它们很可能会泄漏内存并使资源(流,句柄等)保持打开状态。

您发布的其余代码是由Visual Studio生成的,用于处理常见或冗余的MFC任务,例如将Win32消息映射到类或窗口的成员函数。你不应该触摸这段代码,因为它可能会被覆盖,或者你会破坏它并且会遇到调试相关的问题。

答案 3 :(得分: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参考文档。

  

因为我们不知道它有什么功能,我们可以覆盖什么功能......

您通常可以覆盖虚拟而非私有的所有内容。我认为您也可以使用内置于IDE的类向导。

CSortHeaderCtrl显然是第三方类,但不是Microsoft类。也许它的作者/供应商为它写了一些文档,如果你应该使用它的话。

答案 4 :(得分:1)

我的析构函数什么时候应该是虚拟的?

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7