#define before_MFC最近老板管的紧,自己能支配的时间真的不多。偷偷拜读《深入浅出MFC》
阅读到第三章有点开始卡壳了,不过还好把这两个宏的机理研习出来了。先记在这里,以后若又忘了可以翻翻。首先说说动态创建中重要的、不可缺少的这个数据结构CRuntimeClassstruct CRuntimeClass{ char* m_lpszClassName;//用于存放类名 int m_nObjectSize;//用于存放类大小 UNIT m_mSchema;//目前不知道干啥用,以后补充 CObject* (PASCAL*m_pfnCreateObject)();//存放类中CreateObject()函数的地址,如果该类是//抽象类,则该值为NULL。这一点很重要,通过这个值//是否是NULL,可以判断是否能动态建立该类的新对象。 CRuntimeClass* m_pBaseClass; //用于存放其父类的地址 CObject* CreateObject(); //用于创建对象,后面详细解释 static CRuntimeClass* _stdcall Load(); //就当做是一个匹配函数,后面详细解释为啥我说是匹配 //函数}在头文件中的宏#define DECLARE_DYNCREATE(class_name)DECLARE_DYNAMIC(class_name)//这个是声明了一个静态变量和函数,在前一节有说明static CObject* _stdcallCreateObject();//这个函数就是为了创建一个新的对象,返回对象指针。指针//类型为CObject,则如果指到CObject派生出的类,因为虚函数//的性质,依然调用的是派生类的函数在执行文件中解释了static CObject* _stdcallCreateObject();#define IMPLEMENT_DYNCREATE(class_name,base_class_name)
CObject* _stdcallclass_name::CreateObject()
{ return newclass_name;}//每个非抽象类中如果调用了这个宏,则里面的CreateObject()
//就在于建立一个该类的新对象,并返回新对象的地址。用祖宗
//类CObject的指针指向这个新地址
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,class_name::CreateObject)//最后一个参数表明赋予的是这个函数的地址
再来看前面CRuntimeClass中的两个函数
CObject* CRuntimeClass::CreateObject()
{
if(m_pfnCreateObject==NULL))
{
//抽象类这个值就为NULL,非抽象类如上面所述这个值被赋值为了类中CreateObject()函数的地址。
return NULL;
}
CObject*pObject = (*m_pfnCreateObject)();
//若这个值存在,这调用这个函数,函数的作用前面已经说了,就是创建一个新对象。通了吧~~~
returnpObject;
}
解释完这两个宏再讲一下如何动态调用吧。
首先在头文件中得写上这么一行代码
DECLARE_DYNCREATE(class_name);//class_name是你需要动态创建了类名,注意非抽象类。执行文件中得写上这么一行代码IMPLEMENT_DYNCREATE(class_name,base_class_name)//base_class_name是父类然后假如从 输入了一个类名 szClassName;CRuntimeClass pClass;for(pClass = pFirstClass; pClass != NULL; pClass = pClass-> m_pNextClass){if(strcmp(szClassName,pClass->m_lpszClassName)==0)return pClass;}//以上这段代码也就是Load函数的核心部分,就是匹配与输入的名字相同的类,所以前面说Load函数是个匹配的过程pClass->CreateObject();//调用的为该类中的CreateObject();因为没类中都会有一个CRuntimeClass,CRuntimeClass里都会有CeateObject()建立一个新的该类欢迎提建议或问题,必定及时回复