2014-09-25 3 views
3

Я написал этот простой метод константный класса:MessageBox в сопзЬ функции

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 изменяются и как проявляется модификация.' MFC поставляется с исходным кодом. Почему бы не посмотреть исходный код? – PaulMcKenzie

ответ

3

Проблема не в том, что ни ваша функция, ни MessageBox не изменяют какие-либо элементы переменных - их нет, и это легко увидеть.

Проблема заключается в том, что MessageBox не помечена как const и поэтому у вас есть функция const члена (Ваша), призывающая не const один (MessageBox). Это недопустимо, и в этом проблема.

Так почему же это не указано const? Я сомневаюсь, что вы когда-нибудь получите окончательный ответ на этот вопрос, если одна причина действительно существует.

Лично я подозреваю, что это сочетание факторов, из-за которых оно не было const изначально, и теперь это то, что оно есть.

Одна из потенциальных причин состоит в том, что многие внутренние биты MFC и их части включают в себя манипуляции и настройку карт - например, карты, которые связывают объекты Windows HWND с объектами MFC CWnd.

Возможно, им пришлось ослабить использование const, чтобы учесть вызовы не const функций в глубине сети вызовов в тех местах, где пользователи никогда не видят.

Так почему бы не использовать mutable, или, может быть, даже const_cast? Помните, что MFC существует уже давно, и когда он был разработан, компилятор Microsoft может не поддерживать некоторые из более экзотических функций C++ в то время.

+1

Последнее предложение является ключевым. MFC имеет свои собственные реализации виртуального наследования и исключений, поскольку в то время они не были стандартными функциями C++. –

+0

И если вы используете MessageBox в нескольких методах, похожих на MSGTest(), вы можете написать свой собственный 'MsgBox (та же подпись, что и MessageBox) const', чтобы обернуть работу Nik, а затем использовать ваш метод MsgBox над MFC' CWnd :: MessageBox' – franji1

1

На мой взгляд, если CTest получен из CWnd (явно или нет) - отображение диалогового окна на этом объекте CWnd означает изменение состояния окна/элемента управления. Предположим, что CTest получен из CDialog, и нажатие на некоторую кнопку вызывает эту функцию (CTest::MsgTest). Это эффективно означает, что состояние диалогового окна изменилось (с точки зрения пользователя). Не важно, отображается ли модальное или немодальное диалоговое окно - состояние изменилось, поэтому метод не должен быть const.

Смежные вопросы