在class factory中,如何传递class本身作为参数
在class factory的实现中,有两种方式
一是通过一个字符串(class的名称)作为参数,来得到new class
比如:
CClassA public IBaseClass;
CClassB public IBaseClass;
CClassC public IBaseClass;
IBaseClass * GetClass(char * chName)
{
IBaseClass * pClass = NULL;
if (chName 等于 "AAA")
pClass = new CClassA;
else if (chName 等于 "BBB")
pClass = new CClassB;
else if (chName 等于 "CCC")
pClass = new CClassC;
return pClass;
}
这种方法要写很多 if else
还有一种方式是通过Class本身做为参数传递的,代码只要一两行
我在很多年前看过这个实现方法,现在忘了,大概是
CClassA public IBaseClass;
CClassB public IBaseClass;
CClassC public IBaseClass;
IBaseClass * GetClass(这个参数如何写忘了)
{
IBaseClass * pClass = new 这里直接就是class定义;
return pClass;
}
[解决办法]
C++语言不支持动态创建。楼主想用动态创建的话,需要自己动手实现一个。
[解决办法]
个人理解:LZ想要的这种方式,应该用反射就可以实现。但是c++不支持反射,所以,Lz应该向使c++实现反射的方向寻求解决办法。
[解决办法]
7楼正解。建议楼主参考MFC的源代码里面关于DECALRE_DYNCREATE和IMPLEMENT_DYNCREATE的部分,你可以找到实现思路。
[解决办法]
这是我写的一个精简版本的动态创建方案,可以实现你要的功能
// Reflection.h
namespace CommonModel{\
#define DECLARE_REFLECTION(class_name)\
public:\
static void * _stdcall CreateInstance();\
static ClassNode classNode##class_name;\
#define IMPLEMENT_REFLECTION(class_name)\
void * _stdcall class_name::CreateInstance() { return new class_name; }\
ClassNode class_name::classNode##class_name = {\
#class_name,\
class_name::CreateInstance,\
NULL};\
static Assemble assemble##class_name(&class_name::classNode##class_name);\
typedef struct Assembly
{
static void * _stdcall CreateInstance(char * pszClassName);
static char * _stdcall First();
static char * _stdcall Next(char * pszCurrent);
}Assembly;
typedef struct ClassNode
{
static void * _stdcall CreateInstance(char * pszClassName);
static char * _stdcall First();
static char * _stdcall Next(char * pszCurrent);
static ClassNode * m_pFirst;
char * m_pszClassName;
void * (_stdcall * m_pfnCreator) ();
ClassNode * m_pNext;
}ClassNode;
typedef struct Assemble
{
Assemble(ClassNode * pNode);
}Assemble;
}
[解决办法]
用函数模板实现:
template <class T>
IBaseClass * GetClass()
{
IBaseClass *pClass = new T();
return pClass;
}