请问高手们,动态创建需要什么,我们平时是不是只能看到一部分? 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();//完成动态创建。用到的视图文档结构中,只有第二步的那些宏出现,其他几步的代码请问在何处?
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();//完成动态创建。用到的视图文档结构中,只有第二步的那些宏出现,其他几步的代码请问在何处?
在MFC中被以DECLARE_DYNCREATE(CLASSNMAE)+IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)这种方式被封装主要目的:
实现目标类只能实例化一个实例!
#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)
virtual CRuntimeClass* GetRuntimeClass( ) const;
CObject* CRuntimeClass::CreateObject()
{
if(m_pfnCreateObject==NULL) return NULL;
CObject *pObject;
pObject=(* m_pfnCreateObject)(); //函数指针调用
return pObject; }
下面这句话中的函数指针是怎么赋值给它的呢,请指点
pObject=(* m_pfnCreateObject)(); //函数指针调用
设计模式中存在的singleton的模式
在MFC中被以DECLARE_DYNCREATE(CLASSNMAE)+IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)这种方式被封装主要目的:
实现目标类只能实例化一个实例!请问实现目标类只能实例化一个实例有什么用呢?
那么如果有多个文档实例,视图或主框架将会无所适从,不知道访问哪个文档才能获得正确的数据
此时就需要对文档进行单实例化
这样还有一个好处是所有数据处理集中在文档中,视图只负责对数据的具体表现的实现,主框架整体界面的管理和协调
1. 构造函数非public,这样让你不能直接定义或new一个实例
2. 提供统一的实例化接口函数(一般为静态以保证能唯一调用和全局访问)建议理论和实践相结合,适当了解一些理论方面的东西更有助于理解实际的代码