稻草人的麦田

图形技术
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

上班闲下来后,仔细研究了lithtech中的根据类名创建对象的方法,于是自己也写了一个出来。只是我写的是一个通用缩水版,没有和游戏具体结合。如果用于具体游戏,请根据需要添加内容,发出来:

/********************************************************************
 created: 2008/01/02
 created: 2:1:2008   16:41
 filename:  d:\My Documents\Visual Studio Projects\test\test.cpp
 file path: d:\My Documents\Visual Studio Projects\test
 file base: test
 file ext: cpp
 author:  宋晓宇 
 E-mail:  songxiaoyu8@163.com
 
 purpose: 用于类自动管理,包含此文件后,只需要调用
    Declare(A,NULL)
    Declare(B,CC)   就可以对类进行根据字符串自动创建
    example:
    classMgr cm;
    A* ap0 = (A*)cm.GetClassByName("A");
    则此时ap0对象就是所需,并分配给了相应的空间。
*********************************************************************/

#include "stdafx.h"
using namespace std;

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;
};

__ClassDefiner *__g_ClassDefinerHead = NULL;

class __ClassDefiner
{
public:

 __ClassDefiner(ClassDef *pDef)
 {
  m_pClass = pDef;
  m_pNext = __g_ClassDefinerHead;
  __g_ClassDefinerHead = this;
 }

 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)
 {
  __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;
 }
};

//////////////////for test//////////////////////////////////////
////////////////////////////////////////////////////////////
#define Name(K)\
  public: char* getName(){return #K;}

class CC
{

public:
 int a[4];
 CC()
 {
  int k=0;
  k++;
  cout<<"cc"<<endl;
 }
 ~CC(){
  int k=0;
  k++;
  cout<<"!CC"<<endl;

 }


 Name(CC)
};

class  A:public CC
{
public:
 A(){
  a[0]=10000;
  int k=0;
  cout<<"aaaaaaaaaA"<<endl;
 }
 ~A(){
  cout<<"~~aaaaaaaaaA"<<endl;
  int k=0;
 }


 Name(A);
};

class  B:public CC
{
public:
 B()
 {
  cout<<"bbbbbbbbB"<<endl;
 }
 ~B(){}

 Name(B);
};


Declare(A,NULL)
Declare(B,CC)

main()
{

classMgr cm;
A* ap0 = (A*)cm.GetClassByName("A");
cout<<ap0->getName()<<endl;

B* ab0 = (B*)cm.GetClassByName("B");
delete ab0;

}


 


文章来源:http://songxiaoyu8.blog.163.com/blog/static/2081812820080245015991