老闆很無理的要求,硬是讓程式能夠根據給定的字串類名來建立相應的對象,哎,為此折騰了幾天!
////////////////////////reflect.h檔案#ifndef REFLECT_H#define REFLECT_Hclass 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;}