Share via


MFC ASSERT_VALID および CObject::AssertValid

このトピックの内容は、次の製品に該当します。

エディション

Visual Basic

C#

F#

C++

Web Developer

Express

トピック該当なし トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Pro、Premium、Ultimate

トピック該当なし トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

CObject::AssertValid メソッドを使用すると、オブジェクトの内部状態を実行時にチェックできます。 CObject からクラスを派生させる場合、必ずしも AssertValid をオーバーライドする必要はありませんが、そうすることによって、クラスの信頼性を高めることができます。 AssertValid によって、オブジェクトのすべてのメンバー変数に対し、有効な値を保持しているかどうかを検証するアサーションが実行されます。 たとえば、ポインターのメンバー変数が NULL でないかどうかをチェックできます。

AssertValid 関数の宣言方法を次に示します。

class CPerson : public CObject
{
protected:
    CString m_strName;
    float   m_salary;
public:
#ifdef _DEBUG
    // Override
    virtual void AssertValid() const;
#endif
    // ...
};

AssertValid をオーバーライドするときは、派生クラス独自のチェックを行う前に、基本クラスの AssertValid を呼び出します。 その後で、ASSERT マクロを使用して、派生クラス独自のメンバーをチェックします。次に例を示します。

#ifdef _DEBUG
void CPerson::AssertValid() const
{
    // Call inherited AssertValid first.
    CObject::AssertValid();

    // Check CPerson members...
    // Must have a name.
    ASSERT( !m_strName.IsEmpty());
    // Must have an income.
    ASSERT( m_salary > 0 );
}
#endif

オブジェクトを格納しているメンバー変数がある場合は、ASSERT_VALID マクロを使用して、そのオブジェクトの内部状態が有効かどうかを検証します (オブジェクトのクラスが AssertValid をオーバーライドしている場合)。

たとえば、CMyData クラスのメンバー変数の 1 つに CObList が格納されているとします。 CObList 型の変数 m_DataList は、CPerson オブジェクトのコレクションを格納します。 CMyData クラスの宣言の概要を次に示します。

class CMyData : public CObject
{
    // Constructor and other members ...
    protected:
        CObList* m_pDataList;
    // Other declarations ...
    public:
#ifdef _DEBUG
        // Override:
        virtual void AssertValid( ) const;
#endif
    // And so on ...
};

CMyData クラスでオーバーライドした AssertValid は次のようになります。

#ifdef _DEBUG
void CMyData::AssertValid( ) const
{
    // Call inherited AssertValid.
    CObject::AssertValid( );
    // Check validity of CMyData members.
    ASSERT_VALID( m_pDataList );
    // ...
}
#endif

CMyData クラスは、AssertValid の機構を使用して、データ メンバーに格納されているオブジェクトの有効性を検証します。 CMyData クラスでオーバーライドした AssertValid は、独自の m_pDataList メンバー変数に対して ASSERT_VALID マクロを呼び出します。

CObList クラスも AssertValid をオーバーライドしているため、有効性の検証はこの段階では停止しません。 このオーバーライドにより、そのクラスが表すリストの内部状態の有効性も検証されます。 つまり、CMyData オブジェクトの有効性を検証すると、そのメンバー変数に格納されている CObList リスト オブジェクトの内部状態の有効性も検証されることになります。

さらにコードを追加すると、リストに格納されている CPerson オブジェクトの有効性も検証できます。 たとえば、CObList から派生クラス CPersonList を生成し、AssertValid をオーバーライドできます。 このオーバーライドでは、CObject::AssertValid を呼び出した後、リストに格納されている CPerson オブジェクトごとに AssertValid を呼び出すことによってリストを反復処理します。 CPerson クラスは、このトピックの冒頭に示したように、既に AssertValid をオーバーライドしています。

これらの関数やマクロは、デバッグ バージョンのビルドに強力な機構を提供します。 リリース バージョンのビルド時には、この機構は自動的にオフになります。

AssertValid に関する制限事項

特定のクラスで AssertValid 関数を使用する場合、この関数の制限事項を考慮する必要があります。 この関数は、オブジェクトが不正な場合に、アサートしてプログラムの実行を停止します。 ただし、アサートされない場合でも、問題が検出されなかったことを示すだけで、必ずしもオブジェクトに問題がないと保証されたわけではありません。

参照

概念

MFC アサーション