常量函数中的MessageBox

MessageBox in const function

本文关键字:MessageBox 函数 常量      更新时间:2023-10-16

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

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

此方法有一个错误:

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

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

我想是处理程序m_hWnd,但我不知道。

问题不在于函数和MessageBox都不修改任何成员变量——它们不修改,这很容易看到。

问题是MessageBox没有标记为const,因此您有一个const成员函数(您的)调用非const one(MessageBox)。这是不允许的,这就是问题所在。

那么为什么它没有被标记为const呢?如果真的有一个原因的话,我怀疑你是否能得到这个问题的明确答案。

就我个人而言,我怀疑这是多种因素的结合,导致它最初不是const,现在它就是这样

一个潜在的原因是,许多MFC内部的位和块涉及映射的操作和调整,例如将windows HWND对象与MFC CWnd对象关联的映射。

他们可能不得不放松对const的使用,以便在用户从未见过的地方对呼叫链深处的非const函数进行调用。

那么,为什么不使用mutable,甚至可能使用const_cast呢?请记住,MFC已经存在很长时间了,在设计它的时候,Microsoft编译器可能不支持C++的一些更奇特的功能。

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