我看到了有这样的一段代码:
//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的类型。。。
上面的代码是什么意思呢??
好像已经定义了CStudent的类型。。。
#4
《深入浅出MFC》
#5
《深入浅出MFC》 可以吗???
#6
of course it can...
#7
你刚才只是申明了这个类型,而后面在.cpp文件中才是真正的生成这个类的对象
DECLARE_DYNCREATE()与IMPLEMENT_DYNCREATE()这两个都是动态创建的宏,如果要动态创建一个对象,就要引用着两个宏
具体的细节看看《深入浅出》吧,讲的应该很透彻的
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后方可生效。
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
http://www.csdn.net/Expert/topic/470/470143.shtm
#1
我知道很简单,但我真的不知道。。。。
#2
就是在不知道具体的类型的情况下构造一个类,例如对void指针进行强制转换,
#3
什么叫不知道具体类型,
上面的代码是什么意思呢??
好像已经定义了CStudent的类型。。。
上面的代码是什么意思呢??
好像已经定义了CStudent的类型。。。
#4
《深入浅出MFC》
#5
《深入浅出MFC》 可以吗???
#6
of course it can...
#7
你刚才只是申明了这个类型,而后面在.cpp文件中才是真正的生成这个类的对象
DECLARE_DYNCREATE()与IMPLEMENT_DYNCREATE()这两个都是动态创建的宏,如果要动态创建一个对象,就要引用着两个宏
具体的细节看看《深入浅出》吧,讲的应该很透彻的
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后方可生效。
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
http://www.csdn.net/Expert/topic/470/470143.shtm