const函数中的MessageBox

时间:2014-09-25 14:40:37

标签: c++ mfc

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

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

此方法有错误:

  

该对象具有与成员函数CTest :: MessageBoxW

不兼容的类型限定符

我知道这是因为我使用 const 。如果在执行时没有修改成员变量,则方法可以是const方法。我想知道MessageBox修改了哪些变量以及修改如何显示。

我认为这是处理程序m_hWnd,但我不知道。

2 个答案:

答案 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