MFC ソース ファイルの利用

Microsoft Foundation Class (MFC) ライブラリには、完全なソース コードが用意されています。 ヘッダー ファイル (.h) は、\atlmfc\include ディレクトリにあります。 実装ファイル (.cpp) は、\atlmfc\src\mfc ディレクトリにあります。

この記事では、MFC において各クラスのさまざまな部分をコメント化する際に使用されている慣例、これらのコメントの意味、および各セクションの内容について説明します。 Visual Studio のウィザードによって自動的に作成されたクラスに同様の慣例が使用されているため、これらの規則がご自分のコードに役立つ可能性があります。

publicprotected、および 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

CDCCWnd などの大規模なクラスでは、メンバーが多すぎて、1 つのグループ内のすべての属性を列挙しただけでは、あまりわかりやすくならないことがあります。 そのような場合、クラス ライブラリでは、メンバーをさらに細かく説明する他のコメントを見出しとして使用します。 たとえば、CDC では、// Device-Context Functions// Drawing Tool Functions// Drawing Attribute Functions などが使用されています。 属性を表すグループは、上で説明した通常の構文に従います。 多くの OLE クラスには、// Interface Maps という実装セクションがあります。

// Operations コメント

MFC クラス宣言の // Operations セクションには、オブジェクトに対して呼び出して、それに何かをさせたり、アクションを起こしたり (操作を実行) することができるメンバー関数が含まれています。 これらの関数は通常、const ではありません。これらには通常、副作用があるためです。 これらは、クラスのニーズに応じて、仮想または非仮想の場合があります。 通常、これらのメンバーはパブリックです。

コメントの例」にあるクラス CStdioFile のサンプルの一覧では、このコメントの下に 3 つのメンバー関数 (WriteStringReadString の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 コメントの下で宣言されているメンバーを publicprotected、または private として宣言できます。 これらのメンバーは将来変更される可能性があるため、これらは必ず注意して使用してください。 クラス ライブラリの実装が正常に機能するためには、メンバーのグループを public として宣言することが必要な場合があります。 ただし、それは、そのように宣言されたメンバーを安全に使用できるという意味ではありません。

Note

残りの種類のコメントは、// Implementation コメントの上または下に見つかります。 どちらの場合も、それらはその下で宣言されているメンバーの種類を説明しています。 それらが // Implementation コメントの下にある場合は、メンバーが MFC の将来のバージョンで変更される可能性があることを想定する必要があります。

関連項目

MFC の一般的なトピック