информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
К сказанному Ktirf-ом добавлю 22.09.04 10:15  Число просмотров: 1545
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> static метод класса может обращаться только к static
> переменным, а мне нужно из этой функции иметь доступ к
> некоторым переменным внутри класса. или есть способ из
> static метода обратиться к обычным переменным?
Что если ты объявишь обычную функцию-член (как __thiscall), а потом внаглую приведешь ее тип к __stdcall, то обращаться к переменным-членам все равно не сможешь. Все обращения к переменным идут неявно через this (то бишь m_Var = 10; эквивалентно this->m_Var = 10;), а если в этом this (который в том же VC передается через ecx) будет мусор, то и обращения будут в никуда. Лучше уж сразу от них отказаться.
<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 *).
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach