Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
Лучше всего делать static-ом 18.09.04 15:03 Число просмотров: 1563
Автор: amirul <Serge> Статус: The Elderman
|
> можно сделать static-членом, а при желании оформить > функцию-член-класса совместимой по > формату-вызова/параметрам и сделать наглон преобразование > типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc) Потому как наглое явное преобразование чревато большими проблемами, если случайно захочется обратиться через этот самый this к членам-данным или попробовать вызывать функции-члены.
|
<programming>
|
[c++] можно ли сделать функцию обработки сообщений окна (wndproc) членом c++ класса? 13.09.04 07:31
Автор: makeworld Статус: Member
|
Если сделать функцию обработки сообщений окна членом класса, то при создании класса окна (имеется ввиду WNDCLASSEX) выдается ошибка на строчке wndclassex.lpfnWndProc = WinProc
error C2440: '=' : cannot convert from 'LRESULT (__stdcall MYCLASS::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
(окно создается с помощью функции CreateWindowsEx, соответственно для этого окна регистрируется класс функцией RegisterClassEx, где и происходит ошибка)
Видимо потому, что каждому элементу С++ класса неявно передается дополнительный параметр this и соответственно эта функция, являяся элементом класса, под тип WNDPROC не подходит.
Так вот, можно ли как-нибудь функцию обработки сообщений окна сделать членом класса?
|
|
членом класса нет, а вот friend'ом - можно 13.09.04 09:51
Автор: Killer{R} <Dmitry> Статус: Elderman
|
А установив SetWindowLong(hwnd,GWL_USERDATA,(DWORD)this) при создании окна в конкретном экземляре и делая GetWindowLong(hwnd,GWL_USERDATA) в оконной процедуре можно работать со "своим" объектом в процедуре.
|
| |
можно сделать static-членом... 13.09.04 13:37
Автор: leo <Леонид Юрьев> Статус: Elderman
|
можно сделать static-членом, а при желании оформить функцию-член-класса совместимой по формату-вызова/параметрам и сделать наглон преобразование типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc)
|
| | |
Лучше всего делать static-ом 18.09.04 15:03
Автор: amirul <Serge> Статус: The Elderman
|
> можно сделать static-членом, а при желании оформить > функцию-член-класса совместимой по > формату-вызова/параметрам и сделать наглон преобразование > типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc) Потому как наглое явное преобразование чревато большими проблемами, если случайно захочется обратиться через этот самый this к членам-данным или попробовать вызывать функции-члены.
|
| | | |
static метод класса может обращаться только к static... 20.09.04 07:24
Автор: makeworld Статус: Member Отредактировано 20.09.04 07:25 Количество правок: 1
|
> > можно сделать static-членом, а при желании оформить > > функцию-член-класса совместимой по > > формату-вызова/параметрам и сделать наглон > преобразование > > типа wndclassex.lpfn = > (WNDPROC)((void*)MYCLASS::myfunc) > Потому как наглое явное преобразование чревато большими > проблемами, если случайно захочется обратиться через этот > самый this к членам-данным или попробовать вызывать > функции-члены. static метод класса может обращаться только к static переменным, а мне нужно из этой функции иметь доступ к некоторым переменным внутри класса. или есть способ из static метода обратиться к обычным переменным?
|
| | | | |
К сказанному Ktirf-ом добавлю 22.09.04 10:15
Автор: amirul <Serge> Статус: The Elderman
|
> static метод класса может обращаться только к static > переменным, а мне нужно из этой функции иметь доступ к > некоторым переменным внутри класса. или есть способ из > static метода обратиться к обычным переменным? Что если ты объявишь обычную функцию-член (как __thiscall), а потом внаглую приведешь ее тип к __stdcall, то обращаться к переменным-членам все равно не сможешь. Все обращения к переменным идут неявно через this (то бишь m_Var = 10; эквивалентно this->m_Var = 10;), а если в этом this (который в том же VC передается через ecx) будет мусор, то и обращения будут в никуда. Лучше уж сразу от них отказаться.
|
| | | | | |
Re: К сказанному Ktirf-ом добавлю 22.09.04 15:09
Автор: leo <Леонид Юрьев> Статус: Elderman
|
> Что если ты объявишь обычную функцию-член (как __thiscall), > а потом внаглую приведешь ее тип к __stdcall, то обращаться > к переменным-членам все равно не сможешь. Все обращения к > переменным идут неявно через this (то бишь m_Var = 10; > эквивалентно this->m_Var = 10;), а если в этом this > (который в том же VC передается через ecx) будет мусор, то > и обращения будут в никуда. Лучше уж сразу от них > отказаться.
Конечно, если так прыгать на грабли :-)
Но можно просто объявить функцию-член как __stdcall, и всё будет хорошо если конечно this одинарный(sizeof(this) == sizeof(void*)). Сложный this может быть при множественном и/или виртуальном наследовании, но такую ситуацию можно поймать используя #pragma pointers_to_members(...).
|
| | | | |
Обычно это делается прокидыванием указателя на объект через параметры статического метода. 20.09.04 11:52
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
Также хочу напомнить, что имея HWND, можно получить указатель на CWnd, а из него воспользовавшись динамическим приведением типа - указатель на объект нужного класса.
|
| | | |
В VC++.NET явное преобразавание вообще не проходит, при... 19.09.04 07:28
Автор: makeworld Статус: Member Отредактировано 19.09.04 07:33 Количество правок: 1
|
> > можно сделать static-членом, а при желании оформить > > функцию-член-класса совместимой по > > формату-вызова/параметрам и сделать наглон > преобразование > > типа wndclassex.lpfn = > (WNDPROC)((void*)MYCLASS::myfunc) > Потому как наглое явное преобразование чревато большими > проблемами, если случайно захочется обратиться через этот > самый this к членам-данным или попробовать вызывать > функции-члены.
В VC++.NET явное преобразование вообще не проходит, при сборке выдается ошибка
|
| | | | |
Если нельзя, но очень хочется, 22.09.04 10:24
Автор: amirul <Serge> Статус: The Elderman
|
То можно
> В VC++.NET явное преобразование вообще не проходит, при > сборке выдается ошибка Дело в том, что большинство C-style преобразований понимаются компилятором как static_cast (кроме выкидывания спецификатора const, который const_cast). Если уж очень хочется выстрелить себе в ногу, можешь попробовать reinterpret_cast, или прокинуть указатель через (void *).
|
|
|