您的位置:首页 > 移动开发 > IOS开发

根据字符串类名动态创建对象

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;

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐