#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
答案 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