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 |
#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
相关文章推荐
- ATL实现Connection Point的一种简单的方法
- Java测试规范(引用)
- delphi中的时间操作技术(2)
- IP地址的隐藏(delphi实现 )
- DirectX.Capture
- 解析IP地址为主机域名
- 将某一主机域名解析为IP地址
- 力争最简单把*、&说清楚
- 一个画图类,类似ms_chart的线图,适用于科学仿真数据分析(一)
- set()的用法小介
- 使用C#开发COM+组件
- 纯编码实现数据库的建立或压缩
- 从数据库中动态选取下拉列表的方法
- 用ASP备份数据库
- thinking in c++ 卷2
- thinking in c++卷2
- Netscaler数据索引String Map与Pattern Set的区别
- 【Python之旅】第四篇(四):基于面向对象的模拟人生游戏类
- 【Python之旅】第四篇(三):Python面向对象编程详解