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 用複製建構函式會保證編譯程式錯誤訊息。 如果您的類別需要這項功能,請提供複製建構函式。
範例
如需範例中使用的類別清單,CAgeCObject請參閱 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,則會取代此診斷功能。
範例
如需範例中使用的類別清單,CAgeCObject請參閱 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 函式。
範例
如需範例中使用的類別清單,CAgeCObject請參閱 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;
}