Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Метод класса в качестве CALLBACK  (Прочитано 10058 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 13-12-2006 05:32 » 

Допустим есть чужая библиотека которая позволяет установить CALLBACK  на какие то свои события  в доках приведен некий шаблоны CALLBACK функции

Например
void CallEvent (CContent * pContent, long ID_Event, long mFlads )

Мне бы хотелось собрать все эти функции в один класс но у меня есть сомнения что все будет работать если просто передам библиотеке указатель на метод класса. Можно ли в принципе это сделать и как обявить метод класа чтобы еге можно было передать в качестве калбаcк?



 
« Последнее редактирование: 13-12-2006 05:43 от PSD » Записан

Да да нет нет все остальное от лукавого.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-12-2006 09:53 » 

PSD, сомнения верные, потому что работать не будет. Дело в том, что сигнатура метода класса, при ее внешней идентичности сигнатуре
Код:
void CallEvent (CContent * pContent, long ID_Event, long mFlads )
, на самом деле будет такой:
Код:
void MyCallEvent (CMyClass* this, CContent * pContent, long ID_Event, long mFlads )

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

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

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-12-2006 10:11 » 

Ясненько... ну что ж можно и через дружественые функии сотворить....
Записан

Да да нет нет все остальное от лукавого.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 13-12-2006 10:11 » 

ИМХО, уже неоднократно обсуждалось. Метод должен быть статик.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 13-12-2006 10:21 » 

Вот тут
https://forum.shelek.ru/index.php/topic,8487.msg125266.html#msg125266
и тут
https://forum.shelek.ru/index.php/topic,9977.msg141327.html#msg141327
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-12-2006 10:34 » 

ИМХО, уже неоднократно обсуждалось. Метод должен быть статик.

Вариант со статиком я знаю но мне хотелось "переключать"  калбаки между несколькими экзеплярами класса, в принципе можно в месте с методом объявить статический указатель на экзепляр класса и делать что то типа
static CMyClass * pThis;
static  void CMyClass::StatCallBack()
{
   pThis->CallBack();
}

А переключения делать

if (......)  
{
    pThis=this;
}

Но мне казалось что можно сделать както элегантней....
Записан

Да да нет нет все остальное от лукавого.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 13-12-2006 11:36 » 

Да, про статик я забыл. Но по сути это то же самое, что и дружественная функция Улыбаюсь 
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 13-12-2006 11:51 » 

Да, про статик я забыл

Ну, с тобой же и обсуждали. Старость не радость
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-12-2006 12:04 » 

ДжонЖжешь Улыбаюсь) Класс!
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines