我想通过类的名字来动态创建对象,如:
已经有一个类,类名字:CSField
是否可以通过某个方法 如,createInstance("CSField"),来创建一个对象??
我主要是想实现动态创建类的功能请大家帮帮忙
谢谢

解决方案 »

  1.   

    new不就行了?
    你所谓的动态创建是什么意思?
      

  2.   

    谢谢vcleaner的关注,是这样的,我的客户要实现定制,这样他要选择一些项目,我需要根据他选择的项目来创建不同的类的对象,就是为这个创建对象的过程,写一个公用的方法,来实现这个功能,在JAVA和.net里好象是有的,如反射,,不知道这能否实现
      

  3.   

    这个问题我以前回答过,可是csdn却不配合,现在找不到了!
    呵呵,重新给你写一下!
      

  4.   

    给你代码和说明:通过类名称得到该类的新对象指针
    ///////////////////////////////////////////////////////////////////////////
    用过虚拟函数的程序员,肯定对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) 要有默认构造函数
    ////////////////////////////////////////////////////
      

  5.   

    能给一个类的声明的例子吗,如:DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明
    怎么声明
    class CMBase: public CObject
    {
    public:
    int getInt();
    virtual int excute() ;
    CMBase();
    virtual ~CMBase();};
      

  6.   

    看《深入浅出MFC》至于例子,你随便建个MFC单文档,CMainFrame,C×××View,C×××Doc都是动态创建的
    你可以看一下。
      

  7.   

    ///Shape.h
    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
      

  8.   

    IMPLEMENT_SERIAL和DECLARE_SERIAL是包含
    DECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明的!!!IMPLEMENT_SERIAL和DECLARE_SERIAL后,更改serialize函数还可以序列化的!
      

  9.   

    你也可以把IMPLEMENT_SERIAL改成DECLARE_DYNAMIC把DECLARE_SERIAL改成IMPLEMENT_DYNAMIC
      

  10.   

    #include <afx.h>
    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是空的
      

  11.   

    呵呵,上面写反了!你也可以把DECLARE_SERIAL改成DECLARE_DYNAMIC把IMPLEMENT_SERIAL改成IMPLEMENT_DYNAMIC
      

  12.   

    pModuleState->m_classList是空的??
    不大可能,你建的是什么工程?