关于m_hWnd 和 GetSafeHwnd()的问题

biliky 2008-03-25 11:57:14
在CWnd类中,既然m_hWnd 是一个公有变量,为什么还要设一个函数GetSafeHwnd()来返回这个变量啊?调用这个函数与直接操作m_hWnd句柄有什么区别吗?如果没区别的话,GetSafeHwnd()这个函数就显得多余了,函数调用可是占用系统开销的啊,频繁调用可能会影响系统性能啊。MFC为什么还增加这个方法呢?发现很多人也喜欢用这个方法呢。
...全文
1142 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
小菜一枚 2011-12-20
表示没看太明白
回复
star060829 2011-05-20
不错,呵呵
回复
qqqabc_123_xyz 2011-05-18
hehe ........
回复
HoNooD 2010-12-21
[Quote=引用 11 楼 cnzdgs 的回复:]
调用一般成员函数是不需要使用类指针的,只是把类指针作为参数传递过去。但如果是虚函数则需要类指针了。
LZ可以试一下,例如:
A* p = NULL;
p->Fun()
只要Fun不是虚函数且没有访问类成员,是不会有问题的。
[/Quote]
是这样的,这个问题我也碰到过。
回复
zgklem 2010-10-16
就像对话框一样,new出一个对话框,获得的指针可以操作GetSafeHwnd,以及create函数等,但是如果没有创建对话框窗口的话,hwnd就为零了;
回复
cnzdgs 2008-04-15
调用一般成员函数是不需要使用类指针的,只是把类指针作为参数传递过去。但如果是虚函数则需要类指针了。
LZ可以试一下,例如:
A* p = NULL;
p->Fun()
只要Fun不是虚函数且没有访问类成员,是不会有问题的。
回复
biliky 2008-04-07
晕死了,为什么大家只知道说GetSafeHwnd()函数内会检查this指针是否为空而不仔细的看清我的问题呢?我的问题是,你检查this指针之前首先得进入GetSafeHwnd()这个函数来执行它吧?没有一个对象调用这个函数,这个函数是不会执行的。在任何一个类的成员函数里调用另一个成员函数,不管第二个函数是不是从祖先类继承下来还是本身定义的,调用的形式其实都隐式的使用了this指针的。例如,在类A中有两个成员函数Fun1和Fun2,其中Fun2调用Fun1.
void A::Fun2()
{
Fun1(); //这里其实隐含了this指针,跟this->Fun1()没有区别的;
}

难道this为NULL,不能通过它访问成员变量却能调用成员函数?
回复
wangjs720 2008-04-07
GetSafeHwnd()函数内会检查this指针是否为空
回复
biliky 2008-04-07
GetSafeHwnd能获得执行的话,this指针肯定不会为空。不是吗?
回复
biliky 2008-04-07
如果this的值是NULL,那么this->m_hWnd就会产生异常,这肯定是没错的。可是如果this的值是NULL了,你的GetSafeHwnd由谁来执行?这个函数总得有一个对象来执行它吧。
回复
scq2099yt 2008-03-25
安全起见
回复
txk1452 2008-03-25
GetSafeHwnd是内联的,不存在你所说的开销!
在AFXWIN2.INL中定义如下

_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }

这样做只是为了安全检查,如果你的CWnd(子)对象没有挂载窗口时,使用m_hWnd调用成员函数可能会出错
回复
wangxipu 2008-03-25
CWnd::GetSafeHwnd
HWND GetSafeHwnd( ) const;

Return Value

Returns the window handle for a window. Returns NULL if the CWnd is not attached to a window or if it is used with a NULL CWnd pointer.
回复
cnzdgs 2008-03-25
GetSafeHwnd只是检查句柄是否存在,以免发生异常。
回复
cnzdgs 2008-03-25
如果this的值是NULL,那么this->m_hWnd就会产生异常(非法操作)了,在使用指针前为了安全起见先检查指针是否为空,GetSafeHwnd就是替你做这件事。只要你可以确定你不会使用空指针来访问类,就用不着GetSafeHwnd。
回复
biliky 2008-03-25
3楼说的有道理,我没注意到GetSafeHwnd是个内联函数。性能上影响不大了。
可是
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }
中的判断好像也不好理解啊,return 语句能够执行的话,this指针肯定不为空啊,因为执行return语句的就是this指针指向的对象啊,没有这个对象,这条语句没有执行者啊。所以,这个return语句跟 return m_hWnd;没什么区别啊。
还有CWnd(子)对象如果没有挂载窗口时调用这个函数也不能保证获得一个安全的窗口句柄啊,因为这个时候,this指针指向了一个对象,肯定不为空啊,那return语句却返回m_hWnd的值,此时没有加载窗口,返回的m_hWnd的值就不是安全的句柄了。不是吗?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-03-25 11:57
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……