MFC ソース ファイルの利用
Microsoft Foundation Class (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 コメント
MFC クラス宣言の // Constructors
セクションでは、(C++ の概念における) コンストラクターと、オブジェクトを実際に使用するために必要なすべての初期化関数を宣言します。 たとえば、CWnd::Create
が constructors セクション内にあるのは、CWnd
オブジェクトを使用する前に、まず C++ コンストラクターを呼び出してから Create
関数を呼び出すことによって、それが "完全に構築" される必要があるためです。 通常、これらのメンバーはパブリックです。
たとえば、クラス CStdioFile
には 5 つのコンストラクターがあり、そのうちの 1 つが「コメントの例」の一覧に示されています。
// Attributes コメント
MFC クラス宣言の // Attributes
セクションには、オブジェクトの public 属性 (またはプロパティ) が含まれています。 通常、属性はメンバー変数、または Get/Set 関数です。 "Get" と "Set" 関数は、仮想の場合とそうでない場合があります。 "Get" 関数は、多くの場合、const
です。ほとんどの場合、それらには副作用がないためです。 通常、これらのメンバーはパブリックです。 protected 属性と private 属性は、通常、実装セクションにあります。
「コメントの例」にあるクラス CStdioFile
のサンプルの一覧では、1 つのメンバー変数 m_pStream が一覧に含まれています。 クラス CDC
では、このコメントの下に約 20 個のメンバーが列挙されています。
Note
CDC
や CWnd
などの大規模なクラスでは、メンバーが多すぎて、1 つのグループ内のすべての属性を列挙しただけでは、あまりわかりやすくならないことがあります。 そのような場合、クラス ライブラリでは、メンバーをさらに細かく説明する他のコメントを見出しとして使用します。 たとえば、CDC
では、// Device-Context Functions
、// Drawing Tool Functions
、// Drawing Attribute Functions
などが使用されています。 属性を表すグループは、上で説明した通常の構文に従います。 多くの OLE クラスには、// Interface Maps
という実装セクションがあります。
// Operations コメント
MFC クラス宣言の // Operations
セクションには、オブジェクトに対して呼び出して、それに何かをさせたり、アクションを起こしたり (操作を実行) することができるメンバー関数が含まれています。 これらの関数は通常、const
ではありません。これらには通常、副作用があるためです。 これらは、クラスのニーズに応じて、仮想または非仮想の場合があります。 通常、これらのメンバーはパブリックです。
「コメントの例」にあるクラス CStdioFile
のサンプルの一覧では、このコメントの下に 3 つのメンバー関数 (WriteString
と ReadString
の2 つのオーバーロード) が含まれています。
属性と同様に、操作はさらに細かく分割できます。
// Overridables コメント
MFC クラス宣言の // Overridables
セクションには、基底クラスの動作を変更する必要がある場合に派生クラス内でオーバーライドできる仮想関数が含まれています。 これらの名前は、通常、"On" で始まりますが、これは厳密には必要ありません。 ここで示した関数はオーバーライドされるように設計されており、多くの場合、なんらかの種類の "コールバック" または "フック" を実装または提供します。通常、これらのメンバーは protected です。
MFC 自体では、純粋仮想関数は常にこのセクションに配置されます。 C++ の純粋仮想関数は、次の形式をとります。
virtual void OnDraw( ) = 0;
「コメントの例」にあるクラス CStdioFile
のサンプルの一覧では、overridables セクションが一覧に含まれていません。 一方、クラス CDocument
には、約 10 個のオーバーライド可能なメンバー関数が列挙されています。
一部のクラスでは、コメント // Advanced Overridables
も見つかります。 これらの関数は、熟練のプログラマのみがオーバーライドを試みるべきものです。 それらのオーバーライドが必要になることはまずありません。
Note
この記事内で説明されている慣習は、一般に、オートメーション (旧称 OLE オートメーション) のメソッドとプロパティに対してもうまく機能します。 オートメーション メソッドは、MFC の操作に似ています。 オートメーション プロパティは、MFC の属性に似ています。 オートメーション イベント (以前に OLE コントロールと呼ばれていた ActiveX コントロールでサポートされています) は、MFC のオーバーライド可能なメンバー関数に似ています。
// Implementation コメント
// Implementation
セクションは、すべての MFC クラス宣言の中で最も重要な部分です。
このセクションには、すべての実装の詳細が含まれています。 このセクションには、メンバー変数とメンバー関数の両方を含めることができます。 この行の下にあるすべてのものは、MFC の今後のリリースで変更される可能性があります。 それを回避できない限り、// Implementation
行の下にある詳細には依存しないでください。 また、implementation 行の下で宣言されているメンバーについてはドキュメントに記載されていませんが、一部の実装についてはテクニカル ノート内で説明されています。 基底クラスの仮想関数のオーバーライドは、基底クラス関数が定義されているセクションに関係なく、このセクションに存在します。 関数が基底クラスの実装をオーバーライドする場合、それは実装の詳細と見なされます。 通常、これらのメンバーは protected ですが、常にではありません。
「コメントの例」の CStdioFile
の一覧では、// Implementation
コメントの下で宣言されているメンバーを public
、protected
、または private
として宣言できます。 これらのメンバーは将来変更される可能性があるため、これらは必ず注意して使用してください。 クラス ライブラリの実装が正常に機能するためには、メンバーのグループを public
として宣言することが必要な場合があります。 ただし、それは、そのように宣言されたメンバーを安全に使用できるという意味ではありません。
Note
残りの種類のコメントは、// Implementation
コメントの上または下に見つかります。 どちらの場合も、それらはその下で宣言されているメンバーの種類を説明しています。 それらが // Implementation
コメントの下にある場合は、メンバーが MFC の将来のバージョンで変更される可能性があることを想定する必要があります。