![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Хочу ещё поблагодарить за интересную тему. Она мне подсказала интересное решение в моём приложении (по крайней мере, мне нравиться). Суть в следующем:
Есть оконный класс (свой собственный, естественно). Сделан он так, как я описывал выше. Т.е. в классе есть статическая функция, выполняющая роль оконной процедуры. Эта функция получает указатель на объект класса по дескриптору окна (GetWindowLong). Потом вызывается соответствующая сообщению функция. Так вот в окне можно кое-что "перетаскивать" мышкой. Возникла идея написать две разные функции для обработки события WM_MOUSEMOVE. Скажем, OnMouseMove1() и OnMouseMove2(). Ввожу переменную для хранения указателя на текущюю функцию обработки. Меняю значение этой переменной в зависимости от обстоятельств.
Всё работает. Но если не вводить дополнительную переменную MouseProc, то компилятор VC ругается (p->*OnMouseMove)(LOWORD(lParam), HIWORD(lParam)); error C2597: illegal reference to data member 'CWnd::OnMouseMove' in a static member function error C2568: '->*' : unable to resolve function overload В другом месте в не статической функции другая проблема: (*OnMouseMove)(xPos, yPos); error C2171: '*' : illegal on operands of type 'void (__thiscall CWnd::*)(int,int)' error C2064: term does not evaluate to a function Написал (this->*OnMouseMove)(xPos, yPos); и всё OK. Может кто объяснит логику происходящего |
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
В первом случае ты пытаешься из статической фунуции обратиться к нестатическому члену класса, а во втором случае я не уверен, но, как мне кажется, функция должна знать адрес конкретного экземпляра класса, для корректного вызова.
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Ну да. И в чём проблема. Я постоянно обращаюсь и нет проблем. А вызвать функцию по указателю - нелегальная ссылка, видите ли. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Но я и сам понял.
Так и есть Начну со второго примера. Пишу (*OnMouseMove)(xPos, yPos);. VC думает, что я пытаюсь разыменовать переменную типа 'void (__thiscall CWnd::*)(int,int)'. "Нет, - говорит, - нельзя. Без this не можно так делать." Исправляю на (this->*OnMouseMove). "Ага, - говорит VC, - это другое дело. Вызвать можно. this - указатель на CWnd, две переменные типа int в качестве параметров. Всё OK." А в первом случае из-за этого же другая проблема. Надо было писать так: (p->*(p->OnMouseMove))(LOWORD(lParam), HIWORD(lParam)); Так и написал. Всё понял. P.S. Это однозначно надо в FAQ. ВЕЛИК И МОГУЧ ЯЗЫК C++ |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |