MFC ASSERT_VALID および CObject::AssertValid
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
ネイティブのみ |
|||
Standard |
ネイティブのみ |
|||
Pro/Team |
ネイティブのみ |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
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 をオーバーライドしているため、有効性の検証はこの段階では停止しません。CObList クラスによるオーバーライドにより、そのクラスが表すリストの内部状態の有効性も検証されます。つまり、CMyData オブジェクトの有効性を検証すると、そのメンバ変数に格納されている CObList リスト オブジェクトの内部状態の有効性も検証されることになります。
さらにコードを追加すると、リストに格納されている CPerson オブジェクトの有効性も検証できます。たとえば、CObList から派生クラス CPersonList を生成し、AssertValid をオーバーライドできます。このオーバーライドでは、CObject::AssertValid を呼び出した後、リストに格納されている CPerson オブジェクトごとに AssertValid を呼び出すことによってリストを反復処理します。CPerson クラスは、このトピックの冒頭に示したように、既に AssertValid をオーバーライドしています。
これらの関数やマクロは、デバッグ バージョンのビルドに強力な機構を提供します。リリース バージョンのビルド時には、この機構は自動的にオフになります。
AssertValid に関する制限事項
特定のクラスで AssertValid 関数を使用する場合、この関数の制限事項を考慮する必要があります。この関数は、オブジェクトが不正な場合に、アサートしてプログラムの実行を停止します。ただし、アサートされない場合でも、問題が検出されなかったことを示すだけで、必ずしもオブジェクトに問題がないと保証されたわけではありません。