常量函数中的MessageBox

3

我写了这个简单的常量类方法:

void CTest::MSGTest() const
{
    MessageBox(_T("This is a simple test"));
}

这个方法出现了一个错误:

对象具有类型限定符,与成员函数CTest::MessageBoxW不兼容

我知道这是因为我使用了const。如果在执行期间没有修改任何成员变量,那么该方法可以是一个const方法。我想知道MessageBox修改了哪些变量以及修改的表现形式。

我认为它是处理程序m_hWnd,但我不确定。


1
我想知道MessageBox修改了哪些变量以及修改的表现形式是什么。MFC附带源代码,为什么不查看源代码呢? - PaulMcKenzie
2个回答

3
问题不在于你的函数和MessageBox都没有修改任何成员变量 - 这一点很容易看出来。
问题在于MessageBox没有标记为const,因此您有一个const成员函数(您的函数)调用了非const函数(MessageBox)。这是不允许的,这就是问题所在。
那么为什么它没有被标记为const呢?如果确实存在一个原因,我怀疑您永远不会得到一个明确的答案。
个人认为,导致它最初不是const的因素是多方面的,现在它就是这样。
一个潜在的原因是许多内部MFC的细节涉及地图的操作和调整 - 例如将窗口HWND对象与MFC CWnd对象相关联的地图。
可能他们不得不放松对const的使用,以便在用户从未看到的地方深入调用链中调用非const函数。
那么为什么不使用mutable或甚至const_cast呢?请记住,MFC已经存在很长时间了,当它被设计时,微软编译器可能没有支持C++中一些更奇特的功能。

1
最后一句话很关键。MFC有自己的虚拟继承和异常处理实现,因为它们在当时不是标准的C++特性。 - Ben Voigt
如果您在多个类似于MSGTest()的方法中使用MessageBox,您可以编写自己的MsgBox(与MessageBox相同的签名)const来包装Nik的解决方法,然后利用您的MsgBox方法覆盖MFC的CWnd::MessageBox - franji1

1
在我看来,如果CTest从CWnd派生(无论是显式还是隐式)-在此CWnd对象上显示对话框意味着更改窗口/控件的状态。假设CTest从CDialog派生,并且按下某个按钮会调用此函数(CTest :: MsgTest)。这实际上意味着对话框框的状态已更改(从用户的角度来看)。无论是模态对话框还是非模态对话框都不重要-状态已更改,因此该方法不应为const。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接