关于深入浅出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对象指针容纳它,有什么区别?
展开
 我来答
任明星Ming
2013-07-13 · TA获得超过798个赞
知道小有建树答主
回答量:1061
采纳率:100%
帮助的人:1132万
展开全部
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这里的宏只是把输入的参数,转换为一条正常的编程语句,并不是类型转换。
追问
谢谢!第一个问题我懂了,我了解他通过这2个宏创建类的机制。第二个问题呢?他为什么说用CObject*容纳派生类不好,而且还不一定总能满足程序要求,而在宏定义中却还是用的基类指针,而且他完全可以换成派生类指针啊,因为通过类别型录网(CRuntimeClass建立起来的链表)是可以知道当前输入的类的类型的
追答

因为IMPLEMENT_DYNAMIC宏和IMPLEMENT_DYNCREATE所实现的效果是不一样的。


  1. IMPLEMENT_DYNCREATE宏,允许CObject派生类对象在运行时自动建立,是为了“动态创建"类的实例而定义的宏

  2. IMPLEMENT_DYNAMIC宏,是为了确定运行时对象属于哪一个类而定义的宏。


但你所创建的窗口类,永远都是CObject的子类。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式