原文地址:http://blog.csdn.net/dadalan/article/details/4037510
#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, construct_fn, destruct_fn) \
ClassDef _##name##_Class__ = { \
#name, \
construct_fn, destruct_fn, \
sizeof(name), \
}; \
DO_AUTO_CLASSLIST(name) \
__int32 __impl_instance_##name##__;
class ClassDef
{
public:
char *m_ClassName;
//构造函数和析构函数
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) \
DO_DEFAULT_FUNCTIONS(CLASSC) \
CLASS_SYMBOL(CLASSC, Default##CLASSC##Constructor, Default##CLASSC##Destructor)
class classMgr
{
public:
void* GetClassByName(char* _name);
};
#endif
#include "stdafx.h"
#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;
}
#include "stdafx.h"
#include "Reflect.h"
#include <stdlib.h>
//Base、Derived和Child为自己写的测试类,其继承关系为Derived和Child都继承于Base
class Base
{
public:
virtual void DoSth()
{
printf("Base");
}
};
class Derived : public Base
{
public:
virtual void DoSth()
{
printf("Derived");
}
};
class Child : public Base
{
public:
virtual void DoSth()
{
printf("Child");
}
};
///建立类似于MFC RTTI的类型识别网
Declare(Derived);
Declare(Child);
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;
}