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

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

ru
Offline Offline

« : 06-12-2009 08:52 » 

как можно передать апи функции в качестве аргумента ( например wndProc ) вместо callback функции метод с привязкой к объекту класса ?

зы чтобы вместо хранения данных между вызовами callback f. в глобальном контексте они хранились в объекте

Записан

1n c0de we trust
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 06-12-2009 15:17 » 

Создай функцию-обертку.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 07-12-2009 13:35 » 

метод передать нельзя. но в саму callback-функцию (как правило имеющую один-два целочисленных параметра) всегда можно передать ссылку на объект (который есть пойнтер, как известно) и далее всегда можно подставить под этот пойнтер объект нужного типа и в итоге работать с ним из callback - функции.

но в целом подобный затрах говорит о неправильно спроектированном приложении, ибо с точки зрения великого ДАО событие объекта (сиречь event) - это и есть callback - функция. и либо мы юзаем методы в эвентах, либо регулярные процедуры в callback-функциях, на практике женить эти две вещи мне лично пришлось только один раз: когда я писал ООП-обёртку вокруг отлаженного sax-парсера, и мне было влом переписывать парсер с нуля - я просто инкапсулировал его в свой объект и вышеописанным способом дёргал свои эвенты при срабатывании селекторов.
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #3 : 07-12-2009 15:48 » 

Mayor, безусловно, это нужно делать, и это делается так:
class A
{
   public  void f() {}
   
   public static void f(void * obj);
}

void A::f(void * obj)
{ A * a = (A*)obj; a->f(); }

void main()
{
   A * a = new A();
   API_Function1(A::f, (void *)a);
   API_Function2(A::f, (void *)a);
   API_Function3(A::f, (void *)a);
}
« Последнее редактирование: 07-12-2009 16:29 от Sel » Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines