CObject

Microsoft 基础类库中的主体基类。

语法

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 运算符。

备注

它不仅用作库类(如 和 )的根,还 CFile CObList 用作所编写类的根。 CObject 提供基本服务,包括

  • 序列化支持
  • 运行时类信息
  • 对象诊断输出
  • 与集合类的兼容性

CObject 不支持多重继承。 派生类只能有一个 CObject 基类, CObject 并且必须在层次结构中最左侧。 但是,允许将结构和非派生类放在右侧多继承 CObject 分支中。

如果在类实现和声明中使用一些可选宏,你将意识到派生的主要 CObject 好处。

第一级宏 DECLARE_DYNAMICIMPLEMENT_DYNAMIC 允许对类名称及其在层次结构中的位置的运行时访问。 这反过来又允许有意义的诊断转储。

第二级宏( DECLARE_SERIALIMPLEMENT_SERIAL )包含第一级宏的所有功能,并且使对象可以与 "存档" 进行 "序列化"。

有关一般和使用派生 Microsoft 基础类和 c + + 类的信息 CObject ,请参阅 使用 CObject序列化

继承层次结构

CObject

要求

标头:afx.h

CObject::AssertValid

验证此对象的完整性。

virtual void AssertValid() const;

备注

AssertValid 通过检查此对象的内部状态来执行有效性检查。 在库的调试版本中, AssertValid 可以断言,然后终止程序,并在其中列出断言失败的行号和文件名。

编写您自己的类时,应重写该 AssertValid 函数,以便为您自己和您的类的其他用户提供诊断服务。 重写 AssertValid 通常在 AssertValid 检查派生类的唯一数据成员之前调用其基类的函数。

由于 AssertValid 是一个 const 函数,因此不允许在测试期间更改对象状态。 您自己的派生类 AssertValid 函数不应引发异常,而应断言它们是否检测到无效的对象数据。

"有效性" 的定义取决于对象的类。 作为一种规则,该函数应执行 "浅层检查"。 也就是说,如果对象包含指向其他对象的指针,它应检查指针是否不是 NULL ,但不应对指针所引用的对象执行有效性测试。

示例

CObList::CObList有关 CAge 所有示例中使用的类的列表,请参阅 CObject

void CAge::AssertValid() const
{
   CObject::AssertValid();
   ASSERT(m_years > 0); 
   ASSERT(m_years < 105);
}

有关其他示例,请参阅 AfxDoForAllObjects

CObject::CObject

这些函数是标准 CObject 构造函数。

CObject();
CObject(const CObject& objectSrc);

parameters

objectSrc
对另一个的引用 CObject

备注

默认版本自动由派生类的构造函数调用。

如果类是可序列化的 (它合并了宏) ,则必须有一个默认构造函数 (一个在类声明中没有) 参数 IMPLEMENT_SERIAL 的构造函数。 如果不需要默认构造函数,请声明私有或受保护的"空"构造函数。 有关详细信息,请参阅使用 CObject

标准 C++ 默认类复制构造函数执行按成员复制。 如果类的复制构造函数需要但不可用,则存在专用复制构造函数可保证出现编译器 CObject 错误消息。 如果类需要此功能,请提供复制构造函数。

示例

有关 CObList::CObList 示例中使用的 CAge 类列表, CObject 请参阅 。

// 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;

parameters

dc
用于转储的诊断转储上下文,通常为 afxDump

备注

编写自己的类时,应重写 函数 Dump ,为自己和类的其他用户提供诊断服务。 重写的 Dump 通常先调用其基类的 函数,然后再 Dump 打印派生类唯一的数据成员。 CObject::Dump 如果类使用 或 宏,则打印 IMPLEMENT_DYNAMICIMPLEMENT_SERIAL 名。

备注

Dump函数不应在其输出末尾打印一个内联字符。

Dump 调用仅在调试版本的 Microsoft 基础类库。 应该将调用、函数声明和函数实现与 、语句括在一起 #ifdef _DEBUG #endif ,用于条件编译。

由于 是函数,因此在转储期间不允许 Dump const 更改对象状态。

插入 CDumpContext (<<) 指针 Dump 时,插入运算符 CObject 调用 。

Dump 仅允许对象的"非环"转储。 例如,可以转储对象列表,但如果其中一个对象是列表本身,则最终会溢出堆栈。

示例

有关 CObList::CObList 所有示例中使用的 CAge 类列表,请参阅 CObject

void CAge::Dump(CDumpContext& dc) const
{
   CObject::Dump(dc);
   dc << _T("Age = ") << m_years;
}

CObject::GetRuntimeClass

返回 CRuntimeClass 与此对象的类相对应的结构。

virtual CRuntimeClass* GetRuntimeClass() const;

返回值

指向与 CRuntimeClass 此对象的类相对应的结构的指针; 从不 NULL

备注

CRuntimeClass每个派生类都有一个结构 CObject 。 结构成员如下所示:

  • LPCSTR m_lpszClassName 一个以 null 结尾的字符串,其中包含 ASCII 类名。

  • 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 类实现中的、或宏。 否则,会获得错误的结果。

示例

CObList::CObList有关 CAge 所有示例中使用的类的列表,请参阅 CObject

CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

CObject::IsKindOf

测试与给定类的此对象的关系。

BOOL IsKindOf(const CRuntimeClass* pClass) const;

parameters

pClass
指向 CRuntimeClass 与派生类关联的结构的指针 CObject

返回值

如果对象对应于类,则为非零;否则为0。

备注

此函数 pClass 将测试 (1) 它是指定类的对象还是 (2) 它是派生自指定类的类的对象。 此函数仅适用于使用 DECLARE_DYNAMICDECLARE_DYNCREATE 或宏声明的类 DECLARE_SERIAL

请勿广泛使用此函数,因为它会破坏 C++ 多态性功能。 请改为使用虚拟函数。

示例

有关 CObList::CObList 所有示例中使用的 CAge 类列表,请参阅 CObject

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 宏。

备注

不要重写此函数。

示例

有关 CObList::CObList 所有示例中使用的 CAge 类列表,请参阅 CObject

CAge a(21);
ASSERT(a.IsSerializable());

CObject::operator delete

对于库的 Release 版本,运算符 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 ,则放弃此诊断功能。

示例

有关 CObList::CObList 示例中使用的 CAge 类列表, CObject 请参阅 。

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

对于库的 Release 版本,运算符以类似于 的方式执行最佳 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 函数。

示例

CObList::CObList有关 CAge 示例中使用的类的列表,请参阅 CObject

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);

parameters

ar
CArchive 序列化到或的对象。

备注

重写要 Serialize 序列化的每个类。 重写 Serialize 必须先调用 Serialize 其基类的函数。

还必须 DECLARE_SERIAL 在类声明中使用宏,并且必须 IMPLEMENT_SERIAL 在实现中使用宏。

使用 CArchive::IsLoadingCArchive::IsStoring 来确定存档是否正在加载或存储。

Serialize 由和调用 CArchive::ReadObject CArchive::WriteObject 。 这些函数与 CArchive 插入运算符相关联 ( <<) 和 () 的提取运算符 >>

有关序列化示例,请参阅 序列化对象一文。

示例

CObList::CObList有关 CAge 所有示例中使用的类的列表,请参阅 CObject

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

另请参阅

层次结构图