读书人

在class factory中怎么传递class本身

发布时间: 2012-12-29 10:28:09 作者: rapoo

在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;


}

读书人网 >C++

热点推荐