MFC ASSERT_VALID 和 CObject::AssertValid

本主题适用于:

版本

Visual Basic

C#

F#

C++

Web Developer

学习版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

专业版、高级专业版和旗舰版

主题不适用 主题不适用 主题不适用

仅限本机

主题不适用

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 类,该类在其成员变量之一中存储了一个 CObListCObList 变量 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 断言