次の方法で共有


MFC ソース ファイルの使用

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

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

C++ キーワードの publicprotectedprivate について理解している場合があります。 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 人のメンバーを一覧表示します。

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

操作コメント

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

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

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

こちらも参照ください

MFC の一般的なトピック