//函数
}
在头文件中的宏
#define DECLARE_DYNCREATE(class_name)\
DECLARE_DYNAMIC(class_name)\ //这个是声明了一个静态变量和函数,在前一节有说明
static CObject* _stdcall CreateObject();//这个函数就是为了创建一个新的对象,返回对象指针。指针
//类型为CObject,则如果指到CObject派生出的类,因为虚函数
//的性质,依然调用的是派生类的函数
在执行文件中解释了static CObject* _stdcall CreateObject();
#define IMPLEMENT_DYNCREATE(class_name,base_class_name)\
CObject* _stdcall class_name :: CreateObject()\
{ return new class_name;}\//每个非抽象类中如果调用了这个宏,则里面的CreateObject()
//就在于建立一个该类的新对象,并返回新对象的地址。用祖宗
//类CObject的指针指向这个新地址
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,class_name::CreateObject)//最后一个参数表明赋予的是这个函数的地址
再来看前面CRuntimeClass中的两个函数
CObject* CRuntimeClass::CreateObject()
{
if(m_pfnCreateObject==NULL))
{
//抽象类这个值就为NULL,非抽象类如上面所述这个值被赋值为了类中CreateObject()函数的地址。implement_dyncreate
return NULL;
}
CObject* pObject = (*m_pfnCreateObject)();
//若这个值存在,这调用这个函数,函数的作用前面已经说了,就是创建一个新对象。implement_dyncreate通了吧~~~
return pObject;
}
解释完这两个宏再讲一下如何动态调用吧。
首先在头文件中得写上这么一行代码
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()建立一个新的该类
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25931-1.html
五元一吨