Microsoft基础类 (MFC) 库提供完整的源代码。 头文件 (.h) 位于 \atlmfc\include 目录中。 实现文件(.cpp)位于 \atlmfc\src\mfc 目录中。
本文介绍 MFC 用于注释每个类的各个部分、这些注释的含义以及每个部分中应查找的内容的约定。 Visual Studio 向导使用它们为你创建的类的类似约定,你可能会发现这些约定适用于你自己的代码。
你可能熟悉 public
关键字 protected
和 private
C++关键字。 在 MFC 头文件中,你会发现每个类可能有多个这种元素。 例如,公共成员变量和函数可能属于多个 public
关键字。 这是因为 MFC 根据成员变量和函数的使用(而不是允许的访问类型)来分隔成员变量和函数。 MFC 谨慎使用 private
。 即使是视为实现详细信息的项也经常为 protected
,而且很多时候是 public
。 尽管不建议访问实现详细信息,但 MFC 还是将决定权留给你。
在 MFC 源文件和 MFC 应用程序向导创建的头文件中,你将在类声明中找到类似这些注释(通常按以下顺序):
// Constructors
// Attributes
// Operations
// Overridables
// Implementation
注释示例
以下部分类 CStdioFile
列表使用了 MFC 在其类中常用的大多数标准注释,以根据使用方式划分类成员:
/*============================================================================*/
// STDIO file implementation
class CStdioFile : public CFile
{
DECLARE_DYNAMIC(CStdioFile)
public:
// Constructors
CStdioFile();
// . . .
// Attributes
FILE* m_pStream; // stdio FILE
// m_hFile from base class is _fileno(m_pStream)
// Operations
// reading and writing strings
virtual void WriteString(LPCTSTR lpsz);
virtual LPTSTR ReadString(_Out_writes_z_(nMax) LPTSTR lpsz, _In_ UINT nMax);
virtual BOOL ReadString(CString& rString);
// Implementation
public:
virtual ~CStdioFile();
#ifdef _DEBUG
void Dump(CDumpContext& dc) const;
#endif
virtual ULONGLONG GetPosition() const;
virtual ULONGLONG GetLength() const;
virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);
// . . .
protected:
void CommonBaseInit(FILE* pOpenStream, CAtlTransactionManager* pTM);
void CommonInit(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM);
};
这些注释一致地标记包含类似类成员的类声明部分内容。 请记住,它们是 MFC 约定,而不是设置规则。
// Constructors 注释
// Constructors
MFC 类声明的节声明构造函数(在C++意义上),以及真正使用对象所需的任何初始化函数。 例如,CWnd::Create
在构造函数节中,因为在使用CWnd
对象之前,必须先被C++构造函数“完全构造”,然后再调用Create
函数。 通常,这些成员是公共的。
例如,类 CStdioFile
有五个构造函数,其中一个构造函数显示在 注释示例下的列表中。
// Attributes 注释
MFC 类声明的 // Attributes
部分包含对象的公共属性(或特性)。 属性通常是成员变量或 Get/Set 函数。 “Get”和“Set”函数可能不是虚拟函数。 “Get”函数通常是 const
,因为在大多数情况下,它们没有副作用。 这些成员通常是公开的。 保护属性和专用属性通常在实现部分中找到。
在类 CStdioFile
的示例列表中,在 注释示例下,列表包含一个成员变量, m_pStream。 类 CDC
列出此注释下的近 20 个成员。
注释
大型类(如 CDC
和 CWnd
)可能有很多成员,简单地将所有属性列在一个组中可能无法提高清晰度。 在这种情况下,类库使用其他注释作为标题来进一步描述成员。 例如, CDC
使用 // Device-Context Functions
、 // Drawing Tool Functions
使用 // Drawing Attribute Functions
等。 表示属性的组将遵循上述常规语法。 许多 OLE 类都有一个名为 // Interface Maps
的实现部分。
操作注释
// Operations
MFC 类声明部分包含成员函数,您可以调用这些函数使对象执行操作或采取行动。 这些函数通常是非const
,因为它们通常具有副作用。 它们可能是虚拟的或非虚拟的,具体取决于课程需求。 通常,这些成员是公共的。
在CStdioFile
下类 的示例列表中,列表在此注释下包括三个成员函数:WriteString
以及两个 ReadString
重载。
与属性一样,操作也可以进一步细分。
// Overridables 注释
MFC 类声明中的 // Overridables
分节包含可以在派生类中重写的虚拟函数,以在需要时修改基类的行为。 它们通常以“On”开头命名,尽管这不是绝对必要的。 此处的函数设计为进行重写,并且一般实现或提供某种“回调”或“挂钩”。通常这些成员是受保护的。
在 MFC 本身中,纯虚拟函数始终放在本节中。 C++中的纯虚拟函数采用以下形式:
virtual void OnDraw( ) = 0;
在CStdioFile
下类 的示例列表中,列表不包含任何可重写部分。 另一方面,类 CDocument
列出大约 10 个可重写的成员函数。
在某些类中,还可以看到注释 // Advanced Overridables
。 这些只是高级程序员应尝试重写的函数。 你可能从不需要重写它们。
注释
本文中所述的约定也适用于自动化(以前称为 OLE 自动化)方法和属性。 自动化方法类似于 MFC操作。 自动化属性类似于 MFC 属性。 自动化事件(支持 ActiveX 控件,以前称为 OLE 控件)类似于 MFC 可重写的成员函数。
实现过程注释
该 // Implementation
部分是任何 MFC 类声明最重要的部分。
本部分包含所有实现详细信息。 成员变量和成员函数都可以出现在本节中。 此行下方的所有内容在 MFC 的未来版本中可能会更改。 如果能够避免,就不应依赖// Implementation
行下方的详细信息。 此外,在实现行下声明的成员未记录,尽管某些实现在技术说明中讨论过。 基类中虚拟函数的重写位于这个部分,无论基类函数在哪个节中定义。 当函数重写基类实现时,它被视为实现详细信息。 通常,这些成员受到保护,但并非总是受到保护。
在CStdioFile
下的 列表中,可将 // Implementation
注释下声明的成员声明为 public
、protected
、private
。 仅请谨慎使用这些成员,因为它们将来可能会更改。 将一组成员声明为 public
可能是类库实现正常工作所必需的。 但是,这并不意味着可以安全地使用以这种方式声明的成员。
注释
您可以在 // Implementation
注释的上面或下面找到剩余类型的注释。 在任一情况下,这些注释都描述在其下面声明的类型的成员。 如果它们出现在注释 // Implementation
下方,则应假定这些成员可能会在未来的 MFC 版本中发生变化。