Kisser Leon

这个kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

CRuntimeClass的应用

Posted on 2007-04-06 10:10 kk 阅读(1353) 评论(0)  编辑 收藏 引用 所属分类: IT

CRuntimeClassMFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从AB的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。

1、动态确定类

MFCCObject::IsKindOf( const CRuntimeClass* pClass ) 利用CRuntimeClass来进行判定,如果你生成的类是以CObject为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。

class CAge:public CObject

BOOL IsAge(CObject* pO)

{

    return pO->IsKindOf( RUNTIME_CLASS( CAge ) );

}

BOOL IsAge2(CAge* pO)

{

    return pO->IsKindOf( RUNTIME_CLASS( CAge ) );

}

void main(void)

{

    CObject a;

    CAge b;

    IsAge(&a);//return FALSE

    IsAge(&b);//return TRUE

    IsAge2((CAge*)&a);//return FALSE,避免强制转换带来的错误

}

 

2、生成类

CObject CRuntimeClass::CreateObject(void)可以产生一个类变量。作用和new类似,但在某些特殊场合有独特的作用。下面举一个例子来加深了解。

假定有以下几个类定义

class CWndA: public CWnd

class CWndB: public CWnd

function1()

{

    CRuntimeClass* pC=RUNTIME_CLASS( CWndA );

    CreateWnd(pC);

}

CWnd* CreateWnd(CRuntimeClass* pClass)

{

    return (CWnd*)pClass->CreateObject();

}

在上面例子中,CreateWnd返回的是CWnd* 其实它是一个CWndA*。你可以进行由父类到子类的强制转换而不必要担心出错。使用CRuntimeClass可以代替使用switch生产类实例的一些繁琐。(请好好想想它的用途,当你发现它的好处时,你一定会大吃一惊,M$使用宏来实现类的动态检测,如果谁有兴趣可以去看看MFC的源代码。)

 

注意:在类的定义中使用IMPLEMENT_DYNCREATE后方可生效。

 

Google

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理