【问题标题】:What do these C++ code snippets do?这些 C++ 代码片段有什么作用?
【发布时间】:2009-08-30 00:43:51
【问题描述】:
#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

【问题讨论】:

  • void CSortHeaderCtrl::Serialize(CArchive& ar) 什么时候调用这个函数?这是从父级扩展而来的吗?顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?由于我们不知道它有什么功能,我们可以覆盖什么功能......有人回答最后一个问题吗?谢谢

标签: c++ mfc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    m_iSortColumn = -1;
    m_bSortAscending = TRUE;
    

    我强调“想想”,因为对于成员来说 ,只会调用复制构造函数(而不是首先调用 复制构造函数,然后是赋值运算符)。

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

    【讨论】:

    • 谢谢,其他人怎么样?
    • 对不起,我无法回答所有问题,问题1和问题3已经被其他人回答了。
    • void CSortHeaderCtrl::Serialize(CArchive& ar) 什么时候调用这个函数?这是从父级扩展而来的吗?顺便说一句,当你想扩展一个 MFC 类时,你会阅读什么文档?由于我们不知道它有什么功能,我们可以覆盖什么功能......
    【解决方案3】:

    为什么要定义这些标签?

    查看 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 显然是第 3 方类,但不是 Microsoft 类。也许它的作者/供应商为它写了一些文档,如果你应该使用它的话。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-13
          • 1970-01-01
          • 1970-01-01
          • 2013-05-13
          • 2022-12-12
          • 2011-12-31
          • 1970-01-01
          相关资源
          最近更新 更多