我想通过类的名字来动态创建对象,如:
已经有一个类,类名字:CSField
是否可以通过某个方法 如,createInstance("CSField"),来创建一个对象??
我主要是想实现动态创建类的功能请大家帮帮忙
谢谢
已经有一个类,类名字:CSField
是否可以通过某个方法 如,createInstance("CSField"),来创建一个对象??
我主要是想实现动态创建类的功能请大家帮帮忙
谢谢
解决方案 »
- 关于VC6.0的列表控件问题
- 请教:如何只在ListCtrl的第一行显示一个Check Box呢?
- vc中,我在从txt文件中取各行数据时,发现好像连同每行的未尾的换行符也取出来了,怎么在取出来之后去除这个换行符?
- 300分求xp ddk ,2003 ddk 和xp/2k3的ifs的下载地址
- 菜鸟提问!!各位大虾帮帮啊
- 简单问题
- VC中,"."与"->"有什么区别?
- 初学者对窗口类的注册与窗口的诞生的疑问?
- 变体输出不正确的问题,调试状态就正确
- 送分了,送分了,虽然不多,但天天有!
- 关于GetModuleHandle的使用,请指点!!!
- odbc连接oracle数据库,读取blob字段没有问题,插入后一更新救出错,哪位遇到过?能解决吗?分不够可以加
你所谓的动态创建是什么意思?
呵呵,重新给你写一下!
///////////////////////////////////////////////////////////////////////////
用过虚拟函数的程序员,肯定对switch/case 句型带有一种不想用的心理,因为如果case过多的话,至少会有以下缺点:
1) 代码太长,不适合查看和管理;
2) switch/case不够灵活;
3) 扩充性不够好,比如每增加一个case都要更改代码。MFC有一个很好的框架,继承自CObject且通过DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明的类,其动态创建类CRuntimeObject都会被加到类别型录网中去,如果能取得这个动态创建类,就能创建出该类对象。下面的代码就是在类别型录网中寻找类名对应的动态创建类,如果找到,就创建对象,并返回该对象指针;否则返回NULL。CObject* GetObjByClassName(CString strClassName)
{
CRuntimeClass *pClass;
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
for(pClass = pModuleState->m_classList;pClass!=NULL;
pClass=pClass->m_pNextClass) {
if(strClassName.Compare(pClass->m_lpszClassName)==0){
return (pClass->CreateObject());
}
}
return null;
}返回的指针是CObject *类型,在得到后可以转换成你需要的类型!(注意安全控制哦)注:
1) 继承自CObject
2) DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明
3) 要有默认构造函数
////////////////////////////////////////////////////
怎么声明
class CMBase: public CObject
{
public:
int getInt();
virtual int excute() ;
CMBase();
virtual ~CMBase();};
你可以看一下。
class CShape : public CObject
{
//for serialization
DECLARE_SERIAL(CShape)
public:
CShape(){};
//...
}
///////////////////////////////////////////////////////////////////////////////Shape.cpp
#include "Shape.h"IMPLEMENT_SERIAL( CShape, CObject, 0 )
//.......
*******************************************************************************
///Circle.h
class CCircle : public CShape
{
//for serialization
DECLARE_SERIAL(CCircle)
public:
CCircle(){};
//...
}
///////////////////////////////////////////////////////////////////////////////Circle.cpp
#include "Circle.h"IMPLEMENT_SERIAL( CCircle, CShape, 0 )
//.......
*******************************************************************************///Rectangle.h
class CRectangle : public CShape
{
//for serialization
DECLARE_SERIAL(CRectangle)
public:
CRectangle(){};
//...
}
///////////////////////////////////////////////////////////////////////////////Rectangle.cpp
#include "Rectangle.h"IMPLEMENT_SERIAL( CRectangle, CShape, 0 )
//.......
*******************************************************************************
//例子:CShape *pShapeC = GetObjByClassName("CCircle");//Circle
CShape *pShapeR = GetObjByClassName("CRectangle");//Rectangle
DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明的!!!IMPLEMENT_SERIAL和DECLARE_SERIAL后,更改serialize函数还可以序列化的!
class CAutoCreate : public CObject
{
DECLARE_DYNCREATE(CAutoCreate);
public:
CString getName();
CAutoCreate();
virtual ~CAutoCreate();};
IMPLEMENT_DYNCREATE(CAutoCreate,CObject);CAutoCreate::CAutoCreate()
{}CAutoCreate::~CAutoCreate()
{}CString CAutoCreate::getName()
{
return "you are good !";
}
为什么pModuleState->m_classList是空的
不大可能,你建的是什么工程?