请问高手们,动态创建需要什么,我们平时是不是只能看到一部分?  MSDN帮助中提到的动态创建
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CMyClass ) ) );但是我平时基本上不会看到这样用,后来看到帮助中又提到:
动态创建需要的步骤:
1、定义一个不带参数的构造函数(默认构造函数);因为我们是用CreateObject()动态创建,它只有一条语句就是return new XXX,不带任何参数。所以我们要有一个无参构造函数。
2、类说明中使用DECLARE_DYNCREATE(CLASSNMAE)宏;和在类的实现文件中使用IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)宏;这个宏完成构造CRuntimeClass对象,并加入到链表中。
3、使用时先通过宏RUNTIME_CLASS得到类的RunTime信息,然后使用CRuntimeClass的成员函数CreateObject创建一个该类的实例。
4、CObject* pObject = pRuntimeClass->CreateObject();//完成动态创建。用到的视图文档结构中,只有第二步的那些宏出现,其他几步的代码请问在何处?

解决方案 »

  1.   

    use F12 go to define
      

  2.   

    侯俊杰的 深入浅出MFC 讲的比较详细,可以看看
      

  3.   

    设计模式中存在的singleton的模式
    在MFC中被以DECLARE_DYNCREATE(CLASSNMAE)+IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)这种方式被封装主要目的:
    实现目标类只能实例化一个实例!
      

  4.   

    // not serializable, but dynamically constructable
    #define DECLARE_DYNCREATE(class_name) \
    DECLARE_DYNAMIC(class_name) \
    static CObject* PASCAL CreateObject();#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
    CObject* PASCAL class_name::CreateObject() \
    { return new class_name; } \
    IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
    class_name::CreateObject, NULL)
      

  5.   

    CObject::GetRuntimeClass 
    virtual CRuntimeClass* GetRuntimeClass( ) const;
      

  6.   

    这些都是CObject的行为能力了。
      

  7.   

    多谢前辈,我查了您说的这个函数,有一点不明白
    CObject* CRuntimeClass::CreateObject()
    {
            if(m_pfnCreateObject==NULL) return NULL;
            CObject *pObject;
           pObject=(* m_pfnCreateObject)();              //函数指针调用
            return pObject;                              }
    下面这句话中的函数指针是怎么赋值给它的呢,请指点
    pObject=(* m_pfnCreateObject)();              //函数指针调用
            
      

  8.   

    还有一点,前辈您说
    设计模式中存在的singleton的模式
    在MFC中被以DECLARE_DYNCREATE(CLASSNMAE)+IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)这种方式被封装主要目的:
    实现目标类只能实例化一个实例!请问实现目标类只能实例化一个实例有什么用呢?
      

  9.   

    比如文档视结构中,每个视图或主框架都有可能需要访问CMyDocument中的数据
    那么如果有多个文档实例,视图或主框架将会无所适从,不知道访问哪个文档才能获得正确的数据
    此时就需要对文档进行单实例化
    这样还有一个好处是所有数据处理集中在文档中,视图只负责对数据的具体表现的实现,主框架整体界面的管理和协调
      

  10.   

    相对于更易于使用,个人觉得动态创建更多的好处是"准确创建",当然,也增强了封装性单实例的两个要点:
    1. 构造函数非public,这样让你不能直接定义或new一个实例
    2. 提供统一的实例化接口函数(一般为静态以保证能唯一调用和全局访问)建议理论和实践相结合,适当了解一些理论方面的东西更有助于理解实际的代码