2014-09-25 28 views
3

我写了这个简单的常量类方法:的MessageBox在const函数

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

这种方法有一个错误:

The object has type qualifiers that are not compatible with the member function CTest::MessageBoxW

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

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

+1

'我想知道哪些变量的MessageBox修改以及如何修改manifests.' MFC带有源代码。为什么不看源代码? – PaulMcKenzie 2014-09-25 14:53:45

回答

3

问题不在于你的函数和MessageBox都不会修改任何成员变量 - 它们不会,也很容易看到。

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

那么为什么不标记const?如果一个原因真的存在,我怀疑你会永远得到这个问题的明确答案。

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

一个潜在的原因是很多内部的MFC零碎涉及到对地图的操纵和调整 - 例如将windows HWND对象与MFC CWnd对象相关联的地图。

有可能他们不得不放松使用const来解决呼叫链内部非const函数在用户永远不会看到的地方的调用。

那么为什么不使用mutable然后或甚至const_cast?请记住,MFC已经存在了很长一段时间,当它被设计出来的时候,微软编译器可能不支持当时一些更奇特的C++特性。

+1

最后一句是关键。 MFC有它自己的虚拟继承和异常实现,因为那时不是标准的C++特性。 – 2014-09-25 15:13:19

+0

如果您在与MSGTest()类似的多种方法中使用MessageBox,则可以编写自己的'MsgBox(与MessageBox相同的签名)const'来包装Nik的解决方法,然后使用MFC的CWnd :: MessageBox中的MsgBox方法 – franji1 2014-09-25 21:09:10

1

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