MFC中关于运行时类信息及动态创建对象的两个宏的意义

MFC运行时类信息

用途:

程序在运行时,获取对象类的信息及类的继承关系
 

实现:

1、定义的类必须继承自CObject类。
2、类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC()
3、使用:
BOOL CObject::IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类
CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替。


示例:

class CAnimal:public CObject
{
    DECLARE_DYNAMIC(CAnimal)
};
IMPLEMENT_DYNAMIC(CAnimal,CObject)


class CDog:public CAnimal
{
    DECLARE_DYNAMIC(CDog)
};
IMPLEMENT_DYNAMIC(CDog,CAnimal)


int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    CDog dog;
    if(dog.IsKindOf(RUNTIME_CLASS(CAnimal)))
    {
          printf("dog is an animal\n");
    }
    CAnimal animal;
    CRuntimeClass* rt=animal.GetRuntimeClass();
    printf("运行时类信息,类名:%s,大小:%d,版本:%d\n",rt->m_lpszClassName,rt->m_nObjectSize,rt->m_wSchema);
    if(animal.IsKindOf(rt))
    {
          printf("animal is an animal\n");
    }
    return 0;
}






 

动态创建对象

作用和意义:

 一般编程时,使用系统的类定义对象,调用对象的成员函数完成相关的功能。有了动态创建,由用户定义类,系统函数创建该类的对象,由底层代码创建上层类的对象。
 

实现:

1、定义类必须继承自CObject类。
2、类内声明宏DECLARE_DYNCREATE,类外实现宏IMPLEMENT_DYNCREATE
3、使用:


实例:

 

class CAnimal:public CObject
{
    DECLARE_DYNCREATE(CAnimal)
};
IMPLEMENT_DYNCREATE(CAnimal,CObject)
class CDog:public CAnimal
{
     DECLARE_DYNCREATE(CDog)
};
IMPLEMENT_DYNCREATE(CDog,CAnimal)
//定义动态创建对象的函数
void CreateInstance(CRuntimeClass* pClass)
{
    CObject *pObj=pClass->CreateObject();
    printf("对象地址:%p\n",pObj);
    printf("类名:%s\n",pClass->m_lpszClassName);
    delete pObj;
}
int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    CreateInstance(RUNTIME_CLASS(CDog));
    return 0;
}


 

具体实现细节

 

类继承体系中每个类都定义一个CRuntimeClass类型的静态数据成员,并定义静态成员函数 _GetBaseClass、GetThisClass及虚函数GetRuntimeClass。

struct CRuntimeClass

{

// Attributes

   LPCSTR m_lpszClassName;

   int m_nObjectSize;

   UINT m_wSchema; // schema number of the loaded class

   CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class

#ifdef _AFXDLL   

   CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();

#else

   CRuntimeClass* m_pBaseClass;

#endif



// Operations 

   CObject* CreateObject();

   BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;



// dynamic name lookup and creation

   static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);//搜AfxGetModuleState()->m_classList,如果不成功再search classes in shared DLLs, 即pModuleState->m_libraryList->m_classList

   static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);

   static CObject* PASCAL CreateObject(LPCSTR lpszClassName);//从类名字符串,用FromName返回对应的CRuntimeClass,然后调用CRuntimeClass的成员函数CreateObject()

   static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);



// Implementation

   void Store(CArchive& ar) const;

   static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);//从CArchive读入类名字符串,然后返回对应的CRuntimeClass的对象。


// CRuntimeClass objects linked together in simple list

    CRuntimeClass* m_pNextClass;       // linked list of registered classes

    const AFX_CLASSINIT* m_pClassInit;

};


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值