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 的基底類別 (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 函式之使用者應該要了解這個函式的限制。 觸發判斷提示表示物件一定是壞的,且會停止執行。 然而,缺乏判斷提示只表示沒有發現問題,但是不保證物件是好的。