ZFactroy的源代码

用一个宏支持动态创建,创建时候支持参数的传递,例子看前文。

可能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


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值