我写了这个简单的const类方法:
void CTest::MSGTest() const
{
MessageBox(_T("This is a simple test"));
}
此方法有错误:
该对象具有与成员函数CTest :: MessageBoxW
不兼容的类型限定符
我知道这是因为我使用 const 。如果在执行时没有修改成员变量,则方法可以是const方法。我想知道MessageBox修改了哪些变量以及修改如何显示。
我认为这是处理程序m_hWnd,但我不知道。
答案 0 :(得分:3)
问题不在于您的功能和MessageBox
都不会修改任何成员变量 - 它们不会被忽视,而且很容易看到。
问题是MessageBox
未标记为const
,因此您有一个const
成员函数(您的)调用非const
一个MessageBox
)。这是不允许的,这就是问题所在。
那么为什么它没有标记为const
?如果有一个理由确实存在,我怀疑你会得到这个问题的明确答案。
就我个人而言,我怀疑它是导致它最初不是const
的因素的组合,现在它就是它。
一个潜在的原因是许多内部MFC的碎片涉及地图的操作和调整 - 例如将Windows HWND对象与MFC CWnd
对象相关联的地图。
他们可能不得不放松使用const
来解释在用户从未看到的地方呼叫链内的非const
功能的调用。
那么为什么不使用mutable
呢?甚至可能const_cast
?请记住,MFC已经存在了很长时间,当它被设计时,Microsoft编译器可能不支持当时C ++的一些更奇特的功能。
答案 1 :(得分:1)
在我看来,如果CTest
派生自CWnd
(明确与否) - 在此CWnd
对象上显示一个对话框意味着更改窗口/控件的状态。假设CTest
派生自CDialog
,按下某个按钮会调用此函数(CTest::MsgTest
)。它实际上意味着对话框的状态已经改变(从用户的角度来看)。如果显示模态或无模式对话框并不重要 - 状态已更改,因此方法不应为const
。