关于深入浅出MFC动态创建的问题!!
P77页中提到charclassName[30]=GetClassName();//从文件读入或者使用者输入一个类名称CObject*obj=newclassname;/...
P77页中提到
char className[30]=GetClassName();//从文件读入或者使用者输入一个类名称
CObject* obj=new classname; //这一行行不通
1、文中提到new classname这个操作就过不了关,作者意思是编译器不支持这种操作?
2、后面又接着说就算过得了关,但以一个指向MFC类老祖宗(CObject)的对象指针来容纳它觉得没问题,但不好总是如此吧!也不见得能满足你程序的要求。为什么不好总是如此,这不是动态绑定吗?也完全能够访问对象所以成员啊,怎么会不能满足程序要求。
并且在其后第三章所述的MFC动态绑定,其实在宏定义
#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)
中也可看到其实他所谓建构函数,也是通过CObject对象指针容纳它,有什么区别? 展开
char className[30]=GetClassName();//从文件读入或者使用者输入一个类名称
CObject* obj=new classname; //这一行行不通
1、文中提到new classname这个操作就过不了关,作者意思是编译器不支持这种操作?
2、后面又接着说就算过得了关,但以一个指向MFC类老祖宗(CObject)的对象指针来容纳它觉得没问题,但不好总是如此吧!也不见得能满足你程序的要求。为什么不好总是如此,这不是动态绑定吗?也完全能够访问对象所以成员啊,怎么会不能满足程序要求。
并且在其后第三章所述的MFC动态绑定,其实在宏定义
#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)
中也可看到其实他所谓建构函数,也是通过CObject对象指针容纳它,有什么区别? 展开
1个回答
展开全部
CObject* obj=new classname,这个是不同的类型转换,当然不可以。
CObject是类,而classname只是一个字符数组。
请看下面的语句,class_name只是一个类名,比如当class_name为类A时,public下面第一条语句,转换为具体的程序语句为: static const CRuntimeClass class A;
#defineDECLARE_DYNAMIC(class_name) \
public: \
static const CRuntimeClassclass##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#define_DECLARE_DYNAMIC(class_name) \
public: \
staticCRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#endif
用CObject* obj=new classname这个就不行了。MFC这里的宏只是把输入的参数,转换为一条正常的编程语句,并不是类型转换。
CObject是类,而classname只是一个字符数组。
请看下面的语句,class_name只是一个类名,比如当class_name为类A时,public下面第一条语句,转换为具体的程序语句为: static const CRuntimeClass class A;
#defineDECLARE_DYNAMIC(class_name) \
public: \
static const CRuntimeClassclass##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#define_DECLARE_DYNAMIC(class_name) \
public: \
staticCRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#endif
用CObject* obj=new classname这个就不行了。MFC这里的宏只是把输入的参数,转换为一条正常的编程语句,并不是类型转换。
追问
谢谢!第一个问题我懂了,我了解他通过这2个宏创建类的机制。第二个问题呢?他为什么说用CObject*容纳派生类不好,而且还不一定总能满足程序要求,而在宏定义中却还是用的基类指针,而且他完全可以换成派生类指针啊,因为通过类别型录网(CRuntimeClass建立起来的链表)是可以知道当前输入的类的类型的
追答
因为IMPLEMENT_DYNAMIC宏和IMPLEMENT_DYNCREATE所实现的效果是不一样的。
IMPLEMENT_DYNCREATE宏,允许CObject派生类对象在运行时自动建立,是为了“动态创建"类的实例而定义的宏
IMPLEMENT_DYNAMIC宏,是为了确定运行时对象属于哪一个类而定义的宏。
但你所创建的窗口类,永远都是CObject的子类。
ZESTRON
2024-09-04 广告
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸...
点击进入详情页
本回答由ZESTRON提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询