什么叫动态创建??????? (50分)

时间:2022-11-04 11:10:36

我看到了有这样的一段代码:
//student.h
class CStudent :public CObject
{
public:

DECLARE_DYNCREATE(CStudent)   //充许动态创建CStudent对象

.....

};

//student.cpp

IMPLEMENT_DYNCREATE(CStudent,CObject)
...
..


这里面的DECLARE_DYNCREATE()与IMPLEMENT_DYNCREATE()好象就是动态创建用的。

它们具体是怎样用的呢??

什么叫动态创建、、、





14 个解决方案

#1


我知道很简单,但我真的不知道。。。。

#2


就是在不知道具体的类型的情况下构造一个类,例如对void指针进行强制转换,

#3


什么叫不知道具体类型,

上面的代码是什么意思呢??

好像已经定义了CStudent的类型。。。

#4


《深入浅出MFC》

#5


《深入浅出MFC》 可以吗???
 

#6


of course it can...

#7


你刚才只是申明了这个类型,而后面在.cpp文件中才是真正的生成这个类的对象
DECLARE_DYNCREATE()与IMPLEMENT_DYNCREATE()这两个都是动态创建的宏,如果要动态创建一个对象,就要引用着两个宏
具体的细节看看《深入浅出》吧,讲的应该很透彻的

#8


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

1、动态确定类

在MFC中CObject::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后方可生效。
 
 
 

#9


听上面的师傅,一讲,原来不知头绪的现在总算能看懂一点点了!呵呵!谢谢上面的师傅呀!

#10


其实很容易理解,就是new一个对象吗,这也是mfc的一个非常重要的一个功能。比如说,你的程序通过网络放一个对象给另外一个程序,其中对象通过网络转换成数据,当然,你希望接收到是一个对象,并且不需要自己去硬编码创建一个对象(硬编码当然可以,如果传输的对象是种类是很多的,那你的代码将会很多,而且,但每添加一种对象是,还要必须重新修改代码),因此出现了动态创建,根据一点信息,就可以创造出不同的对象了,也就是CRuntimeClass::CreateObject()函数,只要是声明为可以动态创建的东西,都可以通过这个函数创建对象。另外,动态创建也用在对象的序列化中。《深入浅出MFC》这本书非常深入的告诉你怎样实现这种功能和怎样使用,也是本书的几个精彩的地方啊。 

#11


44124关注! :)

#12


哈哈,看什么书啊,直接把MFC的源代码翻出来看看不就行了吗.

#13


你可以把那两个宏展开,他是用一个静态成员实现的,具体我忘了。你可以自己看MFC源码

#14


高手:可以搞定这个!!!
http://www.csdn.net/Expert/topic/470/470143.shtm 

#1


我知道很简单,但我真的不知道。。。。

#2


就是在不知道具体的类型的情况下构造一个类,例如对void指针进行强制转换,

#3


什么叫不知道具体类型,

上面的代码是什么意思呢??

好像已经定义了CStudent的类型。。。

#4


《深入浅出MFC》

#5


《深入浅出MFC》 可以吗???
 

#6


of course it can...

#7


你刚才只是申明了这个类型,而后面在.cpp文件中才是真正的生成这个类的对象
DECLARE_DYNCREATE()与IMPLEMENT_DYNCREATE()这两个都是动态创建的宏,如果要动态创建一个对象,就要引用着两个宏
具体的细节看看《深入浅出》吧,讲的应该很透彻的

#8


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

1、动态确定类

在MFC中CObject::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后方可生效。
 
 
 

#9


听上面的师傅,一讲,原来不知头绪的现在总算能看懂一点点了!呵呵!谢谢上面的师傅呀!

#10


其实很容易理解,就是new一个对象吗,这也是mfc的一个非常重要的一个功能。比如说,你的程序通过网络放一个对象给另外一个程序,其中对象通过网络转换成数据,当然,你希望接收到是一个对象,并且不需要自己去硬编码创建一个对象(硬编码当然可以,如果传输的对象是种类是很多的,那你的代码将会很多,而且,但每添加一种对象是,还要必须重新修改代码),因此出现了动态创建,根据一点信息,就可以创造出不同的对象了,也就是CRuntimeClass::CreateObject()函数,只要是声明为可以动态创建的东西,都可以通过这个函数创建对象。另外,动态创建也用在对象的序列化中。《深入浅出MFC》这本书非常深入的告诉你怎样实现这种功能和怎样使用,也是本书的几个精彩的地方啊。 

#11


44124关注! :)

#12


哈哈,看什么书啊,直接把MFC的源代码翻出来看看不就行了吗.

#13


你可以把那两个宏展开,他是用一个静态成员实现的,具体我忘了。你可以自己看MFC源码

#14


高手:可以搞定这个!!!
http://www.csdn.net/Expert/topic/470/470143.shtm