老板很无理的要求,硬是让程序能够根据给定的字符串类名来创建相应的对象,哎,为此折腾了几天!
reflect.h文件
#ifndef REFLECT_H
#define REFLECT_H
class ClassDef;
class __ClassDefiner;
typedef void (*ConstructObjectFn)(void *pObject);
typedef void (*DestructObjectFn)(void *pObject);
//自己重载new运算符
inline void * __cdecl operator new(unsigned int size,void* ptr,int le,char ch)
{
return ptr;
};
#define DEFINE_HANDLE_TYPE(name) /
typedef struct TT{int __nothing;} name##_t, *name;
//类的构造函数和析构函数
#define DO_DEFAULT_FUNCTIONS(_ClassName) /
void Default##_ClassName##Constructor(void *ptr)/
{/
new(ptr,(int)0,(char)0) _ClassName;/
};/
void Default##_ClassName##Destructor(void *ptr)/
{/
_ClassName *thePtr = (_ClassName*)ptr;/
thePtr->~_ClassName();/
};/
#define DO_AUTO_CLASSLIST(name) /
static __ClassDefiner __##name##_definer(&_##name##_Class__);
//
#define CLASS_SYMBOL(name, parentSymbol, construct_fn, destruct_fn) /
ClassDef _##name##_Class__ = { /
#name, #parentSymbol, /
construct_fn, destruct_fn, /
sizeof(name) ,/
}; /
DO_AUTO_CLASSLIST(name) /
__int32 __impl_instance_##name##__;
class ClassDef
{
public:
char *m_ClassName;
char *m_ParentClass;
//构造函数和析构函数
ConstructObjectFn m_ConstructFn;
DestructObjectFn m_DestructFn;
// How big an object of this class is (set automatically).
long m_ClassObjectSize;
};
class __ClassDefiner
{
public:
__ClassDefiner(ClassDef *pDef);
ClassDef *m_pClass;
__ClassDefiner *m_pNext;
};
#define Declare(CLASSC,CLASSP) /
DO_DEFAULT_FUNCTIONS(CLASSC)/
CLASS_SYMBOL(CLASSC,CLASSP,Default##CLASSC##Constructor,Default##CLASSC##Destructor)
class classMgr
{
public:
void* GetClassByName(char* _name);
};
#endif
///reflect.cpp文件
#include "reflect.h"
#include <iostream>
__ClassDefiner *__g_ClassDefinerHead = NULL;
__ClassDefiner::__ClassDefiner( ClassDef *pDef )
{
m_pClass = pDef;
m_pNext = __g_ClassDefinerHead;
__g_ClassDefinerHead = this;
}
void* classMgr::GetClassByName( char* _name )
{
__ClassDefiner* cd = __g_ClassDefinerHead;
while (cd)
{
if ( strcmp(cd->m_pClass->m_ClassName ,_name) == 0 )
{
void *p = malloc(cd->m_pClass->m_ClassObjectSize);
cd->m_pClass->m_ConstructFn(p);
return p;
}
cd = cd->m_pNext;
}
return NULL;
}
测试程序 //Base、Derived和Child为自己写的测试类,其继承关系为Derived和Child都继承于Base ///建立类似于MFC RTTI的类型识别网 Declare(Derived,Base); Declare(Child,Base); int main() { classMgr cm; Base* b=(Base *)cm.GetClassByName("Derived"); b->DoSth(); getchar(); free(b); b=(Base *)cm.GetClassByName("Child"); b->DoSth(); getchar(); return 0; }