Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса?
Т.е. есть у меня метод
VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime)
надо передать его в функцию :
VOID TimerDictionary::SetTimer()
{
idTimer = SetTimer(0,0,TimeDelay,&TimerProc);
//здесь возникает ошибка
}
Re: как передать в функцию указатель на метод класса
Здравствуйте ArickS, Вы писали:
AS>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>Т.е. есть у меня метод AS>VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>надо передать его в функцию :
AS>VOID TimerDictionary::SetTimer() AS>{ AS> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>//здесь возникает ошибка AS>}
Поищи по форуму.
Do not fake yourself ;) ICQ#: 198114726
Re: как передать в функцию указатель на метод класса
Здравствуйте ArickS, Вы писали:
AS>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>Т.е. есть у меня метод AS>VOID CALLBACK TimerDictionary::MyTimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>надо передать его в функцию :
AS>VOID TimerDictionary::SetTimer() AS>{ AS> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>//здесь возникает ошибка AS>}
Kaa>Функция должна быть либо глобальной, либо статическим членом класса.
Что физически одно и тоже. А тербование это из-за того, что для вызова ф-ции-члена класса, недостаточно знать ее адрес — нужно знать еще и адрес объекта, который она обслуживает.
Re[2]: как передать в функцию указатель на метод класса
Здравствуйте ArickS, Вы писали:
AS>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>Т.е. есть у меня метод AS>VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>надо передать его в функцию :
AS>VOID TimerDictionary::SetTimer() AS>{ AS> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>//здесь возникает ошибка AS>}
Еще бы. Ты пытаешься вщемить 32-бит указатель на функцию + 32 бит указатель на обект в 32 бита ...
Можешь посмотреть ссылку, которую дал тебе RS, но по-моему там навороченно...
Слово static решит одну проблему (компиллятор перестанет ругаться), но создаст другую (потеряешь доступ к переменным объекта класса).
Возможным решением было бы каким-либо образом передавать в твою TimerProc this, либо написать ее так, чтоб она сама получала нужный this.
Re[2]: как передать в функцию указатель на метод класса
Пора, видимо, и мне внести свою маленькую лепту.
AS>>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>>Т.е. есть у меня метод AS>>VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>>надо передать его в функцию :
AS>>VOID TimerDictionary::SetTimer() AS>>{ AS>> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>>//здесь возникает ошибка AS>>} SVV>Еще бы. Ты пытаешься вщемить 32-бит указатель на функцию + 32 бит указатель на обект в 32 бита ...
У тебя странное представление об указателях на члены класса, они не содержат this, более того они часто бывают размером с обычный указатель. Анатоми указателей на члены клаасов уже обсуждалась.
SVV>Можешь посмотреть ссылку, которую дал тебе RS, но по-моему там навороченно...
Интересно что ты считаешь там лишнее.
Re[3]: как передать в функцию указатель на метод класса
Здравствуйте dupamid, Вы писали:
D>Здравствуйте SVV, Вы писали:
D>Пора, видимо, и мне внести свою маленькую лепту.
AS>>>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>>>Т.е. есть у меня метод AS>>>VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>>>надо передать его в функцию :
AS>>>VOID TimerDictionary::SetTimer() AS>>>{ AS>>> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>>>//здесь возникает ошибка AS>>>} SVV>>Еще бы. Ты пытаешься вщемить 32-бит указатель на функцию + 32 бит указатель на обект в 32 бита ...
D>У тебя странное представление об указателях на члены класса, они не содержат this, более того они часто бывают размером с обычный указатель. Анатоми указателей на члены клаасов уже обсуждалась.
Может быть. Это я для простоты (ясности). Конечно же адрес переменной объекта класса = 32 бит, просто чтоб доступиться до него нужно знать this и смещение этой переменной отн. начала стр-ры...
SVV>>Можешь посмотреть ссылку, которую дал тебе RS, но по-моему там навороченно...
D>Интересно что ты считаешь там лишнее.
По ссылке? В целом ничего, т.к. мне показалось, что там слишком много всего, чтобы выполнить предельно простую функцию... Ничего против не имею...
Re[4]: как передать в функцию указатель на метод класса
Здравствуйте ArickS, Вы писали:
AS>Господа программисты ответьте пожалуйста как передать в функцию указатель на метод класса? AS>Т.е. есть у меня метод AS>VOID CALLBACK TimerDictionary::TimerProc(HWND hwnd, UINT uMsg, unsigned int idEvent, DWORD dwTime) AS>надо передать его в функцию :
AS>VOID TimerDictionary::SetTimer() AS>{ AS> idTimer = SetTimer(0,0,TimeDelay,&TimerProc); AS>//здесь возникает ошибка AS>}
Это же у тебя функция обратного вызова? Так она в любом случае не будет работать, так как у нее фиксированный набор параметров, а ей еще неявно this передается. Я бы ее сделал static (впрочем, я так всегда и делаю), а доступ к объекту получаю через this, вот так: