博客日历
2025年07月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
30 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
存档
2025年03月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
MFC学习笔记之5:使用CObject
0.简介
CObject是大部分Microsoft基础类库(MFC)的根基类。CObject 类具有序列化支持、运行时类信息和对象诊断输出等功能,如果从CObject派生类,则类可以使用这些CObject功能。
注意:CObject类的工作需要CRuntimeClass结构的支持。
1.从CObject派生类
在CObject派生类的声明和实现中使用不同的声明和实现宏,有四个不同级别的功能:
a.基本功能:不支持运行时类信息或序列化,但包含诊断内存管理。
class CPerson : public CObject
{
//…
}
b.基本功能加上运行时类信息支持
1)在类声明中使用 DECLARE_DYNAMIC 宏:
class CPerson : public CObject
{
DECLARE_DYNAMIC( CPerson )
//…
};
2)在类的实现文件 (.CPP) 中使用 IMPLEMENT_DYNAMIC 宏:
IMPLEMENT_DYNAMIC( CPerson, CObject )
c.基本功能加上运行时类信息和动态创建支持。
1)在类声明中使用 DECLARE_DYNCreate 宏。
2)定义不带参数的构造函数(默认构造函数)。
3)在类实现文件中使用 IMPLEMENT_DYNCreate 宏。
d.基本功能加上运行时类信息、动态创建和序列化支持。
1)从 CObject 派生类。
2)重写 Serialize 成员函数。(如果直接调用 Serialize,即不想通过多态指针序列化对象,则省略步骤 3 到 5)
3)在类声明中使用 DECLARE_SERIAL 宏。
4)定义不带参数的构造函数(默认构造函数)。
5)在类实现文件中使用 IMPLEMENT_SERIAL 宏。
2.使用CObject类的功能
a.使用 RUNTIME_CLASS 宏获取运行时类对象
CRuntimeClass* pClass = RUNTIME_CLASS(CPerson);
b.使用IsKindOf函数判断当前对象是否是指定类的对象
CObject* pMyObject = new CPerson;
//判断pMyObject指向的对象是否是CPerson类的对象
if(pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) )
{
//…
}
c. 使用CRuntimeClass的CreateObject 函数动态创建对象
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CStudent );
CObject* pObject = pRuntimeClass->CreateObject();
if( pObject!=NULL )
{
//...
}
d.使用序列化功能
只要CObject派生类具有序列化支持,则可以通过重写Serialize 成员函数来实现序列化
void CStudent::Serialize( CArchive& archive )
{
// call base class function first
// base class is CObject in this case
CObject::Serialize( archive );
// now do the stuff for our specific class
if( archive.IsStoring() )
archive << m_name << m_number;
else
archive >> m_name >> m_number;
}
3.在MSDN2003中的位置
ms-help://MS.MSDNQTR.2003FEB.2052/vccore/html/_core_CObject_Class_Topics.htm
上一篇: MFC学习笔记之4:CScrollView的简单应用
下一篇: 在思源学院拍的电视剧《多梦季节》
分类:Win32/C++ 查看次数:5745 发布时间:2009/7/7 13:00:57