我最近在看侯俊杰《深入浅出MFC》,里面类库设计例如:
Cdocument* Cdoctemplate::createnewDocument()
{
CDoument* pDocument=(CDocument*)m_pDocClass->CreateObject();
我的问题是;这样的指针指象何处?类里没产生任何对象呀?在许多类的定义中都有这问题!
Cdocument* Cdoctemplate::createnewDocument()
{
CDoument* pDocument=(CDocument*)m_pDocClass->CreateObject();
我的问题是;这样的指针指象何处?类里没产生任何对象呀?在许多类的定义中都有这问题!
{ return new CframeWnd;}
m_pDocClass是一个CRuntimeClass的指针,(CDocument*)m_pDocClass怎么能指向一个并非CRuntimeClass类的函数,
class cframewnd:public cwnd
{
public:
static cruntimeclass classcframewnd;
virtual cruntimeclass getruntimeclass() const;
static cobject *pascal createobject();
...
};
cobject *pascal cframewnd::createobject()
{return new cframewnd;}
明明是类里的函数!再说如果createobject()定义在cruntimeclass里边,
又怎么能对不同类new 呢?除非用switch/case选择!在说根据C++规则自己的问题自己解决,最好也是类自己解决该类对象动态创建的问题!
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \#define _DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \#else
#define DECLARE_DYNAMIC(class_name) \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \#define _DECLARE_DYNAMIC(class_name) \
public: \
static AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \#endif没有看过候捷的书,也不知他老人家到底说了什么,莫非那个cframewnd类是第老人家的杰作?
new ***(类名)呢?另一种情况就是每个类里有一个createobject(),它的调用靠classruntime对象里一个指向该类createobject()的指针!这样createobject()就可以这样实现:
{ new ***(该类名);}我看后一种比较合理!
问一个问题!————
DECLARE—DYNCREATE在头文件类声明里申明,而IMPLIMENT—DYNCREATE
在.cpp文件里定义,他的作用就是生成一个classruntime对象的串表,问题是
when?how 生成这串表?程序中没体现这样的调用?类的定义如过没声明对象也不会分配存储空间吧/
zark!对你的不厌其烦的答复我非常感谢!我是山东大学学通信的一名学生!真希望认识你!by the way,MFC 的组织真是太乱了!
CObject* CreateObject( );Classes derived from CObject can support dynamic creation, which is the ability to create an object of a specified class at run time.
//**************************************************************
Document, view, and frame classes, for example, should support dynamic creation. The CreateObject member function can be used to implement this function and create objects for these classes during run time.
//**************************************************************For more information on dynamic creation and the CreateObject member, seeCObject Class Topics andCObject Class: Specifying Levels of Functionality in Visual C++ Programmer’s Guide.