共用方式為


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 運算子。

備註

它不僅做為 和 CObListCFile連結庫類別的根目錄,也會作為您撰寫的類別。 CObject 提供基本服務,包括

  • 串行化支援
  • 運行時間類別資訊
  • 物件診斷輸出
  • 與集合類別的相容性

CObject 不支援多重繼承。 您的衍生類別只能有一個 CObject 基類,而且 CObject 必須在階層中最左邊。 不過,允許在右側多重繼承分支中具有結構和非 CObject衍生類別。

如果您在類別實作和宣告中使用一些選擇性巨集,您將瞭解衍生的主要優點 CObject

第一層巨集 DECLARE_DYNAMICIMPLEMENT_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_DYNAMICIMPLEMENT_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_DYNCREATEIMPLEMENT_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_DYNCREATEDECLARE_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 ,仍會收到洩漏偵測,但沒有上述來源檔案行號報告。

如果您覆寫運算符 newdelete,則會取代此診斷功能。

範例

如需範例中使用的類別清單,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::IsLoadingCArchive::IsStoring 來判斷封存是否正在載入或儲存。

SerializeCArchive::ReadObjectCArchive::WriteObject呼叫。 這些函式與 CArchive 插入運算子 ( <<) 和擷取運算子 ( >>) 相關聯。

如需串行化範例,請參閱串行化物件一文

範例

如需所有CObject範例中使用的類別清單,CAge請參閱 CObList::CObList

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

另請參閱

階層架構圖表