CObject
類別
MFC 程式庫的主要基底類別。
語法
class AFX_NOVTABLE CObject
成員
受保護的建構函式
名稱 | 描述 |
---|---|
CObject::CObject |
預設建構函式。 |
公用方法
名稱 | 描述 |
---|---|
CObject::AssertValid |
驗證此物件的完整性。 |
CObject::Dump |
產生這個對象的診斷傾印。 |
CObject::GetRuntimeClass |
傳 CRuntimeClass 回對應至這個物件類別的結構。 |
CObject::IsKindOf |
測試這個物件與指定類別的關聯性。 |
CObject::IsSerializable |
測試以查看是否可以串行化這個物件。 |
CObject::Serialize |
從封存載入或儲存物件。 |
公用運算子
名稱 | 描述 |
---|---|
CObject::operator delete |
特殊 delete 運算子。 |
CObject::operator new |
特殊 new 運算子。 |
備註
它不僅做為 和 CObList
等CFile
連結庫類別的根目錄,也會作為您撰寫的類別。 CObject
提供基本服務,包括
- 串行化支援
- 運行時間類別資訊
- 物件診斷輸出
- 與集合類別的相容性
CObject
不支援多重繼承。 您的衍生類別只能有一個 CObject
基類,而且 CObject
必須在階層中最左邊。 不過,允許在右側多重繼承分支中具有結構和非 CObject
衍生類別。
如果您在類別實作和宣告中使用一些選擇性巨集,您將瞭解衍生的主要優點 CObject
。
第一層巨集 DECLARE_DYNAMIC
和 IMPLEMENT_DYNAMIC
允許運行時間存取類別名稱及其在階層中的位置。 這反過來又允許有意義的診斷傾印。
第二層巨集 和 IMPLEMENT_SERIAL
包含第一層巨集DECLARE_SERIAL
的所有功能,而且可讓物件「串行化」到「封存」。
如需一般 CObject
和使用 衍生Microsoft基礎類別和C++類別的相關信息,請參閱 使用 CObject 和 串行化。
繼承階層架構
CObject
需求
標頭: afx.h
CObject::AssertValid
驗證此物件的完整性。
virtual void AssertValid() const;
備註
AssertValid
藉由檢查其內部狀態,在此對象上執行有效性檢查。 在連結庫的 [偵錯] 版本中, AssertValid
可以判斷提示,然後使用訊息終止程式,其中列出判斷提示失敗的行號和檔名。
當您撰寫自己的類別時,應該覆寫 函 AssertValid
式,為自己和類別的其他使用者提供診斷服務。 覆寫 AssertValid
通常會呼叫 AssertValid
其基類的 函式,然後再檢查衍生類別唯一的數據成員。
因為 AssertValid
是函 const
式,因此您無法在測試期間變更對象狀態。 您自己的衍生類別 AssertValid
函式不應該擲回例外狀況,而是應該判斷它們是否偵測到無效的對象數據。
“validity” 的定義取決於對象的類別。 依規則,函式應該執行「淺層檢查」。也就是說,如果物件包含其他物件的指標,它應該檢查指標是否不是 NULL
,但它不應該對指標所參考的物件執行有效性測試。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
如需其他範例,請參閱 AfxDoForAllObjects
。
CObject::CObject
這些函式是標準 CObject
建構函式。
CObject();
CObject(const CObject& objectSrc);
參數
objectSrc
另一個參考 CObject
備註
衍生類別的建構函式會自動呼叫預設版本。
如果您的類別可串行化(它併入 IMPLEMENT_SERIAL
巨集),則您的類別宣告中必須有預設建構函式(不含自變數的建構函式)。 如果您不需要預設建構函式,請宣告私人或受保護的「空白」建構函式。 如需詳細資訊,請參閱 使用 CObject
。
標準C++預設類別複製建構函式會執行成員逐成員複製。 如果需要類別的複製建構函式,但無法使用,則私 CObject
用複製建構函式會保證編譯程式錯誤訊息。 如果您的類別需要這項功能,請提供複製建構函式。
範例
如需範例中使用的類別清單,CAge
CObject
請參閱 CObList::CObList
。
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
將對象的內容傾印至 CDumpContext
物件。
virtual void Dump(CDumpContext& dc) const;
參數
dc
傾印的診斷傾印內容,通常是 afxDump
。
備註
當您撰寫自己的類別時,應該覆寫 函 Dump
式,為自己和類別的其他使用者提供診斷服務。 覆寫 Dump
通常會呼叫其基類的 函式, Dump
再列印衍生類別唯一的數據成員。 CObject::Dump
如果您的類別使用 IMPLEMENT_DYNAMIC
或 IMPLEMENT_SERIAL
巨集,則會列印類別名稱。
注意
您的 Dump
函式不應該在輸出結尾列印換行符。
Dump
呼叫只有在 Microsoft Foundation Class Library 的偵錯版本中才有意義。 您應該使用 、 #endif
語句括住呼叫、函式宣告和函#ifdef _DEBUG
式實作,以便進行條件式編譯。
因為 Dump
是函 const
式,因此您無法在傾印期間變更對象狀態。
插入CDumpContext
指標時CObject
,插入運算子會<<呼叫 Dump
。
Dump
只允許物件的「無迴圈」傾印。 例如,您可以傾印物件清單,但如果其中一個對像是清單本身,您最終就會溢出堆疊。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
傳 CRuntimeClass
回對應至這個物件類別的結構。
virtual CRuntimeClass* GetRuntimeClass() const;
傳回值
對應至這個物件類別之結構的指標 CRuntimeClass
,絕不 NULL
為 。
備註
每個CObject
衍生類別都有一個 CRuntimeClass
結構。 結構成員如下所示:
LPCSTR m_lpszClassName
包含 ASCII 類別名稱的 Null 終止字串。int m_nObjectSize
物件的大小,以位元組為單位。 如果物件具有指向已配置記憶體的數據成員,則不包含該記憶體的大小。UINT m_wSchema
架構編號 (不可串行化類別的 -1)。IMPLEMENT_SERIAL
如需架構編號的描述,請參閱巨集。CObject* (PASCAL* m_pfnCreateObject)()
建立類別物件之預設建構函式的函式指標(只有在類別支援動態建立時才有效,否則會傳NULL
回 )。CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
如果您的應用程式動態連結至 MFC 的 AFXDLL 版本,則為傳回CRuntimeClass
基類結構的函式指標。CRuntimeClass* m_pBaseClass
如果您的應用程式以靜態方式連結至 MFC,則為基類結構的指標CRuntimeClass
。
此函式需要在 IMPLEMENT_DYNAMIC
類別實作中使用、 IMPLEMENT_DYNCREATE
或 IMPLEMENT_SERIAL
巨集。 否則,您會收到不正確的結果。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
測試這個物件與指定類別的關聯性。
BOOL IsKindOf(const CRuntimeClass* pClass) const;
參數
pClass
與衍生類別相關聯的CObject
結構指標CRuntimeClass
。
傳回值
如果對象對應至 類別,則為非零;否則為 0。
備註
此函式會測試 pClass
它是否為指定類別的物件,或 (2) 是衍生自指定類別的類別物件。 此函式僅適用於以、 DECLARE_DYNCREATE
或 DECLARE_SERIAL
巨集宣告的DECLARE_DYNAMIC
類別。
請勿廣泛使用此函式,因為它會擊敗C++多型特徵。 請改用虛擬函式。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
CAge a(21); // Must use IMPLEMENT_DYNAMIC, IMPLEMENT _DYNCREATE, or
// IMPLEMENT_SERIAL
ASSERT(a.IsKindOf(RUNTIME_CLASS(CAge)));
ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject)));
CObject::IsSerializable
測試此物件是否符合串行化資格。
BOOL IsSerializable() const;
傳回值
如果這個物件可以串行化,則為非零;否則為 0。
備註
若要讓類別可串行化,其宣告必須包含 DECLARE_SERIAL
巨集,而實作必須包含 IMPLEMENT_SERIAL
巨集。
注意
請勿覆寫此函式。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
針對連結庫的發行版本,運算符 delete
會釋放運算子 new
所配置的記憶體。
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
備註
在偵錯版本中,操作員 delete
會參與配置監視配置,其設計目的是偵測記憶體流失。
如果您使用程式代碼行
#define new DEBUG_NEW
在中的任何實作之前。CPP 檔案,然後使用的第三個版本 delete
,將檔名和行號儲存在配置的區塊中,以供稍後報告使用。 您不必擔心提供額外的參數;巨集會為您處理。
即使您未在偵錯模式中使用 DEBUG_NEW
,仍會收到洩漏偵測,但沒有上述來源檔案行號報告。
如果您覆寫運算符 new
和 delete
,則會取代此診斷功能。
範例
如需範例中使用的類別清單,CAge
CObject
請參閱 CObList::CObList
。
void CAge::operator delete(void* p)
{
free(p);
}
void CAge::operator delete(void *p, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
free(p);
}
CObject::operator new
針對連結庫的發行版本,運算符 new
會以類似 malloc
的方式來執行最佳記憶體配置。
void* PASCAL operator new(size_t nSize);
void* PASCAL operator new(size_t, void* p);
void* PASCAL operator new(
size_t nSize,
LPCSTR lpszFileName,
int nLine);
備註
在偵錯版本中,操作員 new
會參與配置監視配置,其設計目的是偵測記憶體流失。
如果您使用程式代碼行
#define new DEBUG_NEW
在中的任何實作之前。CPP 檔案,然後使用的第二個版本 new
,將檔名和行號儲存在配置的區塊中,以供稍後報告使用。 您不必擔心提供額外的參數;巨集會為您處理。
即使您未在偵錯模式中使用 DEBUG_NEW
,仍會收到洩漏偵測,但沒有上述來源檔案行號報告。
注意
如果您覆寫此運算符,您也必須覆寫 delete
。 請勿使用標準連結庫 _new_handler
函式。
範例
如需範例中使用的類別清單,CAge
CObject
請參閱 CObList::CObList
。
void* CAge::operator new(size_t nSize)
{
return malloc(nSize);
}
void* CAge::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
return malloc(nSize);
}
CObject::Serialize
從封存中讀取或寫入此物件。
virtual void Serialize(CArchive& ar);
參數
ar
CArchive
要串行化至或從中串行化的物件。
備註
針對您想要串行化的每個類別覆寫 Serialize
。 覆寫 Serialize
必須先呼叫 Serialize
其基類的函式。
您也必須在類別宣告中使用 DECLARE_SERIAL
巨集,而且必須在 IMPLEMENT_SERIAL
實作中使用 巨集。
使用 CArchive::IsLoading
或 CArchive::IsStoring
來判斷封存是否正在載入或儲存。
Serialize
由 CArchive::ReadObject
和 CArchive::WriteObject
呼叫。 這些函式與 CArchive
插入運算子 ( <<
) 和擷取運算子 ( >>
) 相關聯。
如需串行化範例,請參閱串行化物件一文。
範例
如需所有CObject
範例中使用的類別清單,CAge
請參閱 CObList::CObList
。
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}