用一个宏支持动态创建,创建时候支持参数的传递,例子看前文。 可能Zfactory.h底部的#include看起来不顺眼,不过没有办法,似乎只有这样才能 在vc,bcb,gcc下面都通过编译。。。。 -----------------ZFactory.h--------------------- #ifndef ZFACTORY_H #include <string>
typedef void* (*CreateFunArg0)(); class RegisterInfo;
#define RegisterClass(id,classname)/ #define RegisterClassArg1(id,classname,type1)/ #define RegisterClassArg2(id,classname,type1,type2)/ #define RegisterClassArg3(id,classname,type1,type2,type3)/
class ZFactory void* ZFactory::CreateClass(int classId); template<class TYPE1, class TYPE2> template<class TYPE1, class TYPE2,class TYPE3> ~ZFactory() { void ClearList(RegisterInfo* header); |
//-------------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