VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 745|回复: 2

[求助] 关于CView 的问题,求解释

[复制链接]
53_avatar_middle
在线会员 发表于 2016-1-9 12:05:07 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 xieglt 于 2016-1-9 12:11 编辑

我写一个自己的类, 继承CView

用ClassWizard生成一下,代码如下

Class CMyView : public CView
{
protected:
        CMyView ();           // protected constructor used by dynamic creation
        DECLARE_DYNCREATE(CMyView)
         
       //省略若干行...

protected:
        virtual ~CMyView ();
}

这样,我的CMyView 做好了,但其构造函数和析构函数都是 protected,

也就是说,我无法这样声明一个对象 CMyView  myview;

也无法new 一个对象  CMyView  * pView = new CMyView();

以上语句编译无法通过。

当然,我可以把关键字 protected 修改为 public,问题一:这么修改会有什么负面影响吗?

通常,我都用另外一种方法,而不是将 protected 改成 public

定义一个宏如下

#define  CreateDynamicView(className,pView)         \
             do{                                                      \
                              CRuntimeClass * pGetObject = RUNTIME_CLASS(className); \
                        pView =  reinterpret_cast<className *>(pGetObject->CreateObject()); \
              }while(FALSE);


那么我就可以这样生成对象了

CMyView * pView;
CreateDynamicView(CMyView,pView);

问题二:

我生成的 pView 很显然是不能被 delete 的,因为~CMyView()也是protected

那么我的pView 在什么时候被释放呢?



问题三:
有人说c++用宏很不优雅,想把宏改成模板函数该怎么写?







上一篇:关于MFC控件调用的问题
下一篇:【求助】开源谷歌浏览器的问题
51_avatar_middle
online_admins 发表于 2016-1-9 13:43:06 | 显示全部楼层
问题1:既然 MFC 的 CView 及其派生类中已经默认把构造和析构函数声明成 protected 类型的了,那么愿意就是不希望你使用 new 的方式自己创建出来,是希望你使用 RUNTIME_CLASS,也就是楼主的那种方式来实例化 View 对象的;

问题2:既然构造函数和析构函数都被声明成了 protected 类型的,所以外部是调用不了的,但是不要忘记了内部的成员函数是可以调用 protected 类型的构造函数和析构函数的,这也是为什么 RUNTIME_CLASS 的方式可以调用的原因,同理,类的析构函数也会在 View 窗口被销毁的时候被调用的,楼主可以自己新建个单文档的工程,之后在 View 类构造函数和析构函数中加个断点,之后调试下就知道是怎么被调用的了。

问题3:可以说在C语言中建议用宏的方式,在C++中,因为是面向对象,所以不建议用宏的方式,不过既然CView是MFC中的类,所以,我的建议还是跟着MFC的风格走吧,所以用楼主当前的这种 RUNTIME_CLASS 的方式就可以了。

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
53_avatar_small xieglt + 1 + 1

查看全部评分

53_avatar_middle
ico_lz  楼主| 发表于 2016-1-9 18:25:53 | 显示全部楼层
本帖最后由 xieglt 于 2016-1-9 18:27 编辑

真郁闷,

#define  CreateDynamicView(className,pView)         \
             do{                                                      \
                              CRuntimeClass * pGetObject = RUNTIME_CLASS(className); \
                        pView =  reinterpret_cast<className *>(pGetObject->CreateObject()); \
              }while(FALSE);

宏编译通不过,RUNTIME_CLASS 这个宏解析的时候,必须传递一个真实存在的类名,
reinterpret_cast 这个玩意也通不过。

估计写成模板函数也会出现 RUNTIME_CLASS 的解析错误。

只能老老实实在CMyView 里写个静态函数了。

static CMyView *  CreateSelf()
{
       CRuntimeClass * pGetObject = RUNTIME_CLASS(CMyView);
       CMyView * pView =  reinterpret_cast<CMyView *>(pGetObject->CreateObject());
       return pView;
}

MFC的宏真是让人无语。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-19 23:41

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表