Further work base on RTTI:
1. CRuntimeClass
CObject* CreateObject() ;
static CRuntimeClass* PASCAL Load();
2. #define DECLARE_DYNCREATE(class_name) /
DECLARE_DYNAMIC(class_name) /
static CObject* PASCAL CreateObject();
#define IMPLEMENT_DYNACREATE(class_name, base_class_name) /
CObject* PASACAL class_name:: CreateObject() /
{return new class_name;} /
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, /
class_name::CreateObject)
3. CObject* CRuntimeClass::CreateObject()
{
if (m_pfnCreateObject == null)
return null;
return (*m_pfnCreateObject)();
}
4. CRuntimeClass* PASCAL CRuntimeClass::Load()
{
char szClassName[64];
cin << szClassName;
CRuntimeClass* pClass;
for (pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass )
if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
return pClass;
return NULL;
}
. Apply
CRuntimeClass* pClassRef;
CObject* pOb;
while(1)
{
if ( (pClassRef = CRuntimeClass::Load() ) == NULL)
break;
pOb = pClassRef->CreateObject();
if (pOb != null)
pOb->DoSomething();
}
1. CRuntimeClass
CObject* CreateObject() ;
static CRuntimeClass* PASCAL Load();
2. #define DECLARE_DYNCREATE(class_name) /
DECLARE_DYNAMIC(class_name) /
static CObject* PASCAL CreateObject();
#define IMPLEMENT_DYNACREATE(class_name, base_class_name) /
CObject* PASACAL class_name:: CreateObject() /
{return new class_name;} /
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, /
class_name::CreateObject)
3. CObject* CRuntimeClass::CreateObject()
{
if (m_pfnCreateObject == null)
return null;
return (*m_pfnCreateObject)();
}
4. CRuntimeClass* PASCAL CRuntimeClass::Load()
{
char szClassName[64];
cin << szClassName;
CRuntimeClass* pClass;
for (pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass )
if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
return pClass;
return NULL;
}
. Apply
CRuntimeClass* pClassRef;
CObject* pOb;
while(1)
{
if ( (pClassRef = CRuntimeClass::Load() ) == NULL)
break;
pOb = pClassRef->CreateObject();
if (pOb != null)
pOb->DoSomething();
}