下面是 CStdioFile 类的部分列表,其中使用了 MFC 在其类中按类成员的用法划分它们时所采用的大多数标准注释:
class CStdioFile : public CFile { DECLARE_DYNAMIC(CStdioFile) public: // Constructors CStdioFile(); ... // Attributes FILE* m_pStream; // stdio FILE ... // Operations virtual void WriteString(LPCTSTR lpsz); ... virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax); ... // Implementation public: ... };
这些注释以一致的方式标记包含类型相似的类成员的类声明节。注意,这些注释是 MFC 约定,不是固定规则。
使用 MFC 源文件:
Microsoft 基础类 (MFC) 库提供了完整的源代码。头文件 (.h) 位于 \atlmfc\include 目录中,而实现文件 (.cpp) 位于 \atlmfc\src\mfc 目录中。
注意 \atlmfc\src\mfc 目录包含一个生成文件,该文件可与 NMAKE 一起使用以生成 MFC 库版本(包括浏览版本)。MFC 的浏览版本对于通过 MFC 调用结构本身进行跟踪非常有用。该目录中的 Readme.Txt 文件解释了如何使用此生成文件。
本文解释 MFC 用于注释每个类各部分的约定、这些注释的含义以及在每节中应该可以找到的内容。Visual C++ 向导对其创建的类使用类似的约定,您可能会发现这些约定对于您自己的代码很有用。
您可能已经熟悉 public、protected 和 private C++ 关键字。当查看 MFC 头文件时,您会发现每个类都可能具有上述每种关键字的几个。例如,公共成员变量和函数可能在多个 public 关键字之下。这是因为 MFC 基于成员变量和函数的使用而非允许的访问类型来分隔它们。MFC 对 private 的使用很保守;即使是被视为实现详细信息的项通常都受保护,但很多时候它们是公共的。尽管不鼓励访问实现详细信息,但 MFC 将决定权留给您。
在 MFC 源文件和“MFC 应用程序向导”创建的文件中,在类声明中都可以找到类似下面的注释(通常按此顺序):
// Constructors
// Attributes
// Operations
// Overridables
// Implementation
// Implementation /implimen'teiʃən/ n实现
// Implementation 节是任何 MFC 类声明中最重要的部分。
此节包括所有的实现详细信息。成员变量和成员函数都可以出现在此节中。在将来的 MFC 版本中,该行下面的所有内容都可能更改。不应依赖 // Implementation 行下的详细信息,除非只能这样做。另外,未记录在实现行下声明的成员,但在技术说明中讨论了某些实现。无论基类中的虚函数是在哪一节中定义的,该基类函数的重写都包括在本节中,因为函数重写基类实现这一事实被视为实现详细信息。这些成员通常是受保护的,但并非总是如此。
从注释示例下的 CStdioFile 列表中可以看到,在 // Implementation 注释下面声明的成员可声明为 public、protected 或 private。但使用这些成员时应谨慎,因为它们将来可能更改。将一组成员声明为 public 对使类库实现正常工作可能有必要。但这并不意味着可以安全地使用这样声明的成员。
注意 在 // Implementation 注释的上方或下方可以找到其余类型的注释。无论出现在上方还是下方,这些注释都描述在它们下面声明的成员类型。如果它们出现在 // Implementation 注释下方,则应假定这些成员在将来的 MFC 版本中可能更改。
// 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 类声明中的 // Operations 节包含成员函数;可以在对象上调用这些函数,以使该对象执行任务或执行操作。这些函数一般是非 const 的,因为它们通常有副作用。它们可以是虚拟的,也可以不是虚拟的,具体取决于类的需要。这些成员通常是公共的。
在注释示例中的 CStdioFile 类的示例列表中,此注释下包括两个成员函数:ReadString 和 WriteString。
与属性一样,操作也可以进一步细分。
// Constructors 注释
MFC 类声明中的 // Constructors 节声明构造函数(从 C++ 的角度)以及实际使用对象所需的任何初始化函数。例如,CWnd::Create 位于构造函数节中,因为在使用 CWnd 对象之前,必须首先调用 C++ 构造函数,然后调用 Create 函数来“完整构造”它。这些成员通常是公共的。
例如,CStdioFile 类有三个构造函数,其中一个显示在注释示例下的列表中。
// Overridables 注释
MFC 类声明中的 // Overridables 节包含虚函数;当您需要修改基类行为时,可以在派生类中重写这些函数。虚函数的名称通常以“On”开头,但 On 不是绝对需要的。此处的函数旨在被重写,并且常实现或提供某种类型的“回调”或“挂钩”。这些成员通常是受保护的。
在 MFC 本身中,纯虚函数总是放在此节中。C++ 中的纯虚函数是下面这样的形式:
virtual void OnDraw( ) = 0;
在注释示例中的 CStdioFile 类的示例列表中不包括任何可重写节。另一方面,CDocument 类列出了大约 10 个可重写的成员函数。
在某些类中还可以看到注释 // Advanced Overridables。这些是只有高级程序员才应尝试重写的函数。您可能永远不需要重写它们。
注意 本文描述的约定通常也适用于自动化(以前称为 OLE 自动化)方法和属性。自动化方法类似于 MFC 操作。自动化属性类似于 MFC 特性。自动化事件(支持 ActiveX 控件,以前称为 OLE 控件)类似于 MFC 可重写的成员函数。