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 类,该类在其成员变量之一中存储了一个 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 函数的用户应该意识到此函数的限制。 触发的断言指示对象一定有错误,并且执行将停止。 但是,缺少断言只指示未找到任何问题,并不保证对象是好的。