您的位置:首页 > 编程语言

ZFactroy的源代码

2004-07-04 17:47 471 查看
用一个宏支持动态创建,创建时候支持参数的传递,例子看前文。
可能Zfactory.h底部的#include看起来不顺眼,不过没有办法,似乎只有这样才能
在vc,bcb,gcc下面都通过编译。。。。
-----------------ZFactory.h---------------------
#ifndef ZFACTORY_H
#define ZFACTORY_H
#include <string>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
 
typedef void* (*CreateFunArg0)();
typedef void*   (*CreateFunArg1)(void*);
typedef void*   (*CreateFunArg2)(void*,void*);
typedef void*   (*CreateFunArg3)(void*,void*,void*);
class RegisterInfo;
class RegisterInfoArg0;
class RegisterInfoArg1;
class RegisterInfoArg2;
class RegisterInfoArg3;
 
#define RegisterClass(id,classname)/
 static classname* Create##classname(){ /
 return new classname; /
}/
RegisterInfoArg0 mRegisterInfo##classname( #classname,(CreateFunArg0)Create##classname,id); /
#define RegisterClassArg1(id,classname,type1)/
static classname* CreateArg1##classname(type1 arg1){ /
 return new classname(arg1); /
}/
static classname* CreateShadowArg1##classname(void* arg1){ /
 return CreateArg1##classname( *((type1*)arg1) ); /
}/
RegisterInfoArg1 mRegisterInfoArg1##classname(#classname,(CreateFunArg1)CreateShadowArg1##classname,id); /
#define RegisterClassArg2(id,classname,type1,type2)/
static classname* CreateArg2##classname(type1 arg1, type2 arg2){ /
 return new classname(arg1,arg2); /
}/
static classname* CreateShadowArg2##classname(void* arg1, void* arg2){ /
 return CreateArg2##classname( *((type1*)arg1),*((type2*)arg2) ); /
}/
RegisterInfoArg2 mRegisterInfoArg2##classname(#classname,(CreateFunArg2)CreateShadowArg2##classname,id); /
#define RegisterClassArg3(id,classname,type1,type2,type3)/
static classname* CreateArg3##classname(type1 arg1, type2 arg2,type3 arg3){ /
 return new classname(arg1,arg2,arg3); /
}/
static classname* CreateShadowArg3##classname(void* arg1, void* arg2,void* arg3){ /
 return CreateArg3##classname( *((type1*)arg1),*((type2*)arg2),*((type3*)arg3)); /
}/
RegisterInfoArg3 mRegisterInfoArg3##classname(#classname,(CreateFunArg3)CreateShadowArg3##classname,id); /
 
class ZFactory
{
public:  
 static ZFactory* GetInstance(); 
 void* ZFactory::CreateClass(int classId);
 
 template<class TYPE>
 void* CreateClass(int classId,TYPE arg1)
 {
  RegisterInfo* tmp = RegArg1Header->Find(classId); 
  if(tmp==0) return 0;
  else
   return (((RegisterInfoArg1*)tmp)->Creator)((void*)&arg1);
 };
 template<class TYPE1, class TYPE2>
 void* CreateClass(int classId,TYPE1 arg1,TYPE2 arg2)
 {
  RegisterInfo* tmp  = RegArg2Header->Find(classId); 
  if(tmp==0) return 0;
  else
   return (((RegisterInfoArg2*)tmp)->Creator)((void*)&arg1,(void*)&arg2); 
 };
 template<class TYPE1, class TYPE2,class TYPE3>
 void* CreateClass(int classId,TYPE1 arg1,TYPE2 arg2,TYPE3 arg3)
 {
  RegisterInfo* tmp  = RegArg3Header->Find(classId); 
  if(tmp==0) return 0;
  else
   return (((RegisterInfoArg3*)tmp)->Creator)((void*)&arg1,(void*)&arg2,(void*)&arg3); 
 };
 ~ZFactory() {
  ClearList(RegArg0Header);
  ClearList(RegArg1Header);
  ClearList(RegArg2Header);
  ClearList(RegArg3Header);
 }
private:
 ZFactory()
 {
  RegArg0Header = 0;
  RegArg1Header = 0;
  RegArg2Header = 0;
  RegArg3Header = 0;
 };
 void ClearList(RegisterInfo* header);
 
 static ZFactory* mInstance;
 RegisterInfo * RegArg0Header;
 RegisterInfo * RegArg1Header;
 RegisterInfo * RegArg2Header;
 RegisterInfo * RegArg3Header;
 
 friend class RegisterInfo;
 friend class RegisterInfoArg0;
 friend class RegisterInfoArg1;
 friend class RegisterInfoArg2;
 friend class RegisterInfoArg3;
};
#include "Register.h"
#endif

//-------------ZFactory.cpp-----------------------
#include "ZFactory.h"

ZFactory* ZFactory::mInstance = 0;
void* ZFactory::CreateClass(int classId)
{
 RegisterInfo* tmp = RegArg0Header->Find(classId); 
 if(tmp==0)
  return 0;
 else
  return (((RegisterInfoArg0*)tmp)->Creator)();
}

ZFactory* ZFactory::GetInstance()
{
 if(mInstance == 0)
 {
  mInstance = new ZFactory;
  mInstance->RegArg0Header = new RegisterInfo(); 
  mInstance->RegArg1Header = new RegisterInfo();
  mInstance->RegArg2Header = new RegisterInfo();
  mInstance->RegArg3Header = new RegisterInfo();
 }
 return mInstance;
}

void ClearList(RegisterInfo* header)
{
 RegisterInfo* tmp = header;
 while(tmp)
 {
  tmp = tmp->Next;
  delete tmp;
 }
}
 
//---------------ZRegister.h---------------------
#ifndef REGISTER_H
#define REGISTER_H
#include "ZFactory.h"
class RegisterInfo
{
public:
 RegisterInfo()
  :Name("Header"),Identify(0),Next(0)
 {};
 RegisterInfo* Find(int classId)
 {
  RegisterInfo* tmp = this;
  while(classId != tmp->Identify)  
   tmp = tmp->Next;
  return tmp;
 }
 RegisterInfo* Tail()
 {
  RegisterInfo* tmp = this;    
  while(tmp->Next)   
   tmp=tmp->Next;   
  return tmp;
 }
 string     Name;
 int    Identify; 
 RegisterInfo* Next;
protected:
 void Init(string n,int i,RegisterInfo* header)
 {
  Name = n;
  Identify=i;
  Next=0;
  header->Tail()->Next = this;   
 }
 
 
};
class RegisterInfoArg0:public RegisterInfo
{
public:
 RegisterInfoArg0():RegisterInfo(){};
 RegisterInfoArg0::RegisterInfoArg0(string n,CreateFunArg0 c,int i)
 :Creator(c)
 { 
  Init(n,i,ZFactory::GetInstance()->RegArg0Header);
  
 }
 CreateFunArg0 Creator;
};
class RegisterInfoArg1:public RegisterInfo
{
public:
 RegisterInfoArg1():RegisterInfo(){};
 RegisterInfoArg1::RegisterInfoArg1(string n,CreateFunArg1 c,int i)
 :Creator(c)
 {  
  Init(n,i,ZFactory::GetInstance()->RegArg1Header); 
 }
 CreateFunArg1 Creator;
};

class RegisterInfoArg2:public RegisterInfo
{
public:
 RegisterInfoArg2():RegisterInfo(){};
 RegisterInfoArg2::RegisterInfoArg2(string n,CreateFunArg2 c,int i)
 :Creator(c)
 {  
  Init(n,i,ZFactory::GetInstance()->RegArg2Header);   
 }
 CreateFunArg2 Creator;
};
class RegisterInfoArg3:public RegisterInfo
{
public:
 RegisterInfoArg3():RegisterInfo(){};
 RegisterInfoArg3::RegisterInfoArg3(string n,CreateFunArg3 c,int i)
 :Creator(c)
 {  
  Init(n,i,ZFactory::GetInstance()->RegArg3Header);   
 }
 CreateFunArg3 Creator;
};
#endif

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