Microsoft Foundation Class (MFC) ライブラリには、完全なソース コードが用意されています。 ヘッダー ファイル (.h) は \atlmfc\include ディレクトリにあります。 実装ファイル (.cpp) は 、\atlmfc\src\mfc ディレクトリにあります。
この記事では、MFC が各クラスのさまざまな部分をコメントするために使用する規則、これらのコメントの意味、および各セクションで見つける必要がある内容について説明します。 Visual Studio ウィザードでは、作成するクラスに対して同様の規則が使用されるため、これらの規則は独自のコードに役立つ可能性があります。
C++ キーワードの public
、 protected
、 private
について理解している場合があります。 MFC ヘッダーファイルには、各クラスにそれぞれ複数の項目が含まれていることがあります。 たとえば、パブリック メンバー変数と関数が複数の public
キーワードの下にある場合があります。 MFC は、許可されるアクセスの種類ではなく、その使用に基づいてメンバー変数と関数を分離するためです。 MFC では、 private
を控えめに使用します。 実装の詳細と見なされる項目でも、ほとんどの場合は protected
であり、public
である場合も多くあります。 実装の詳細へのアクセスは推奨されませんが、その判断はユーザーに委ねられています。
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 規則であり、ルールを設定しないことに注意してください。
コンストラクターのコメント
MFC クラス宣言の // Constructors
セクションでは、コンストラクター (C++ の意味で) と、オブジェクトを実際に使用するために必要なすべての初期化関数を宣言します。 たとえば、CWnd::Create
はコンストラクター セクションに含まれています。これは、CWnd
オブジェクトを使用する前に、最初に C++ コンストラクターを呼び出し、次に Create
関数を呼び出すことによって「完全に構築」されなければならないからです。 通常、これらのメンバーはパブリックです。
たとえば、クラス CStdioFile
には 5 つのコンストラクターがあり、そのうちの 1 つは コメントの例の一覧に示されています。
属性コメント
MFC クラス宣言の // Attributes
セクションには、オブジェクトのパブリック属性 (またはプロパティ) が含まれています。 通常、属性はメンバー変数または Get/Set 関数です。 "Get" 関数と "Set" 関数は、仮想である場合とそうでない場合があります。 多くの場合、"Get" 関数は const
されます。ほとんどの場合、副作用がないためです。 通常、これらのメンバーはパブリックです。 通常、保護属性とプライベート属性は実装セクションにあります。
クラス CStdioFile
のサンプル リストでは、 コメントの例の下に、m_pStreamメンバー変数 が 1 つ含まれています。 クラス CDC
は、このコメントの下に約 20 人のメンバーを一覧表示します。
注
CDC
やCWnd
などの大規模なクラスには非常に多くのメンバーが含まれている可能性があるため、1 つのグループ内のすべての属性を一覧表示するだけでは、わかりにくくなることがあります。 このような場合、クラス ライブラリは他のコメントを見出しとして使用して、メンバーをさらに詳しく示します。 たとえば、 CDC
では、 // Device-Context Functions
、 // Drawing Tool Functions
、 // Drawing Attribute Functions
などを使用します。 属性を表すグループは、上記の通常の構文に従います。 多くの OLE クラスには、 // Interface Maps
という実装セクションがあります。
操作コメント
MFC クラス宣言の // Operations
セクションには、オブジェクトに対して呼び出して処理を行ったり、アクションを実行したり (操作を実行する) メンバー関数が含まれています。 これらの関数は、副作用があるため、通常、const
ではありません。 クラスのニーズに応じて、仮想または非仮想である可能性があります。 通常、これらのメンバーはパブリックです。
クラス CStdioFile
のサンプル リストのコメントの例では、このリストには、この コメントの下に 3 つのメンバー関数 ( WriteString
と ReadString
の 2 つのオーバーロード) が含まれています。
属性と同様に、操作をさらに細かく分割できます。
// Overridables コメント
MFC クラス宣言の // Overridables
セクションには、基底クラスの動作を変更する必要がある場合に派生クラスでオーバーライドできる仮想関数が含まれています。 通常、名前は "On" で始まりますが、厳密には必要ありません。 ここでの関数はオーバーライドされるように設計されており、多くの場合、何らかの "コールバック" または "フック" を実装または提供します。通常、これらのメンバーは保護されます。
MFC 自体では、純粋な仮想関数は常にこのセクションに配置されます。 C++ の純粋仮想関数は、次の形式になります。
virtual void OnDraw( ) = 0;
クラス CStdioFile
のサンプルリストのコメントの例では、リストにオーバーライド可能なセクションが含まれていません。 一方、クラス CDocument
には、約 10 個のオーバーライド可能なメンバー関数が一覧表示されます。
一部のクラスでは、コメント // Advanced Overridables
も表示される場合があります。 これらの関数は、高度なプログラマのみがオーバーライドを試みる必要がある関数です。 それらのオーバーライドが必要になることはまずありません。
注
この記事で説明する規則は、オートメーション (旧称 OLE オートメーション) のメソッドとプロパティでも一般的に適切に機能します。 オートメーション メソッドは MFC 操作に似ています。 オートメーション プロパティは MFC 属性に似ています。 オートメーション イベント (以前は OLE コントロールと呼ばれる ActiveX コントロールでサポートされています) は、MFC のオーバーライド可能なメンバー関数に似ています。
実装コメント
// Implementation
セクションは、MFC クラス宣言の最も重要な部分です。
このセクションでは、すべての実装の詳細について説明します。 このセクションでは、メンバー変数とメンバー関数の両方を使用できます。 この行の下にあるすべてのものが、MFC の将来のリリースで変更される可能性があります。 回避できない場合を除き、 // Implementation
行の下の詳細に依存しないでください。 さらに、実装行の下で宣言されたメンバーは文書化されていませんが、一部の実装については技術ノートで説明されています。 基底クラスの仮想関数のオーバーライドは、基底クラス関数が定義されているセクションに関係なく、このセクションに存在します。 関数が基底クラスの実装をオーバーライドすると、実装の詳細と見なされます。 通常、これらのメンバーは保護されますが、常に保護されるとは限りません。
コメントの例の下のCStdioFile
リストでは、// Implementation
コメントの下で宣言されたメンバーは、public
、protected
、またはprivate
として宣言できます。 これらのメンバーは、将来変更される可能性があるため、注意して使用してください。 クラス ライブラリの実装が正しく機能するためには、メンバーのグループを public
として宣言することが必要な場合があります。 ただし、宣言されたメンバーを安全に使用できるわけではありません。
注
残りの型のコメントは、 // Implementation
コメントの上または下にあります。 どちらの場合も、その下で宣言されたメンバーの種類を記述します。 // Implementation
コメントの下に存在する場合は、メンバーが MFC の将来のバージョンで変更される可能性があることを想定する必要があります。