MFC ASSERT_VALID 和 CObject::AssertValid
更新:2007 年 11 月
這個主題適用於:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
僅適用原生 |
|||
Standard 版 |
僅適用原生 |
|||
Pro/Team 版 |
僅適用原生 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
CObject::AssertValid 方法提供物件內部狀態的執行階段檢查。雖然當您從 CObject 衍生您的類別時,您不需要覆寫 AssertValid,但這樣做可以讓您的類別更可靠。AssertValid 應該在所有物件的成員變數 (Member Variable) 上執行判斷提示來驗證它們是否包含有效值。例如,它應該檢查指標成員變數不是 NULL。
下面的範例顯示如何宣告 AssertValid 函式:
class CPerson : public CObject
{
protected:
CString m_strName;
float m_salary;
public:
#ifdef _DEBUG
// Override
virtual void AssertValid() const;
#endif
// ...
};
當您覆寫 AssertValid 時,請在執行您自己的檢查之前呼叫 AssertValid 的基底類別 (Base Class) 版本。然後使用 ASSERT 巨集來檢查您的衍生類別 (Derived Class) 唯一的成員,如同下列所示:
#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 集合物件 (Collection)。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 函式之使用者應該要了解這個函式的限制。觸發判斷提示表示物件一定是壞的,且會停止執行。然而,缺乏判斷提示只表示沒有發現問題,但是不保證物件是好的。