根据字符串类名动态创建对象
2008-07-03 19:49
441 查看
老板很无理的要求,硬是让程序能够根据给定的字符串类名来创建相应的对象,哎,为此折腾了几天!
////////////////////////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; }
相关文章推荐
- 根据字符串类名动态创建对象
- 根据字符串类名动态创建对象
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- [转载内容]动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, params Object[] args )
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, pa
- C # 根据字符串动态的创建对象 类 反射
- c++动态加载dll中的类(用于实现依据字符串类名创建对象)
- C#如何根据字符串动态的创建对象(类)?
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, params Object[] args )
- C#如何根据字符串动态的创建对象(类)
- c++动态加载dll中的类(用于实现依据字符串类名创建对象)
- 根据ResultSetMetaData对象动态创建pojo或其集合(JDBC)
- C++实现反射(根据类名动态创建对象)
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值【转】
- C# 中反射获取某类的子类和根据类型名动态创建对象
- VCL动态创建对象-根据类名创建对象
- 根据类Student的定义,创建五个该类的对象,输出每个学生的信息, 计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。
- Swift通过类名动态创建对象的方式
- createElement动态创建HTML对象