Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование метода класса в качестве callback-функции

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Tunga

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Не буду ставить задачу абстрактно, сразу опишу свой случай.
Имеем классы:

Код:
 class A{
public:
   void x(void* param1, bool param2);   //типичная callback-функция
}
 
class B{
public:
   void y(void (*param1)(void*, bool));   //сюда нужно передать типичную callback-функцию
}
 
class C{
private:
   A* a;
   B* b;
   void WorkThread(void);
}
 
C::WorkThread(){
   this->a = new A;
   this->b = new B;
   this->b->y(.......);    //вот тут бааааааальшая такая проблема образовалась
}  

 
Итак, необходимо передать в метод B::y метод A::x в качестве callback-функции. Есть идеи?
ЗЫ: в гугл не отсылайте, пожалуйста. Там все достаточно сильно закручено. Так, что достаточно непросто разобраться. Тем более, что я еще не особо искушен. Хотелось бы более-менее подробных объяснений.

Всего записей: 19 | Зарегистр. 15-06-2005 | Отправлено: 14:56 15-06-2005
OtD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tunga

Код:
 
 class A{
public:  
   void x(void* param1, bool param2);   //типичная callback-функция
};
 
typedef void (__stdcall *CALLBACKPROC)(void*, bool);
 
class B{  
public:  
   void y(CALLBACKPROC pr);   //сюда нужно передать типичную callback-функцию
};
 
class C{
private:
   A* a;
   B* b;
   void WorkThread();
};  
 
void C::WorkThread(){
 
   CALLBACKPROC pr;
 
   this->a = new A;  
   this->b = new B;  
   //this->b->y(.......);    //вот тут бааааааальшая такая проблема образовалась
   this->b->y(pr);
   //
}
 

Надо функции определить и логику.  
И пож. синтаксические ошибки не допускай, рабочий код давай.
Скажи, чё сделать-то хочешь? Удачи.

Всего записей: 50 | Зарегистр. 02-06-2005 | Отправлено: 15:36 15-06-2005
Tunga

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OtD
Ну точки с запятыми и делетов наставлять это я действительно не подумал. Забыл)
А по поводу вашего решения: а вы пробовали его компилировать?
Дело в том, что
void (__stdcall *)(void*, bool);
и
void (__thiscall A::*)(void *,bool)
совсем не одно и то же. Во втором вызове неявно передается параметр this - на один параметр больше. Компилятор об этом честно предупреждает, когда говорит, что не может провести приведение типов.
Да и указатель на функцию мало объявить, его еще нужно настроить именно на мой метод.
А пишу я библиотеку COM-компонент с довольно сложной логикой. Поэтому и необходимо по возможности всю работу пихать внутрь классов - чтобы было как можно меньше глобальных функций.
В любом случае спасибо)

Всего записей: 19 | Зарегистр. 15-06-2005 | Отправлено: 16:17 15-06-2005 | Исправлено: Tunga, 11:31 20-06-2005
peacebird



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tunga
class A{  
public:  
  static void x(void* param1, bool param2);   //типичная callback-функция  
}  
 
class B{  
public:  
   void y(void (*param1)(void*, bool));   //сюда нужно передать типичную callback-функцию  
}  
 
class C{  
private:  
   A* a;  
   B* b;  
   void WorkThread(void);  
}  
 
C::WorkThread(){  
   this->a = new A;  
   this->b = new B;  
   this->b->y(&A::x);    //вот тут бааааааальшая такая проблема образовалась  
}  
 
можно так но у ф-и у не будет доступа к членам класса A ,можно посмотреть в сторону обобщенных указателей на функции члены std::mem_fun_ref и std::mem_fun , boost::function или написать свой велосипед, или использовать вариант с неявной передачей this void (__stdcall A::*)(void *,bool) AFAIK больше вариантов нет

Всего записей: 40 | Зарегистр. 10-03-2005 | Отправлено: 10:44 16-06-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tunga
Посмотри здесь. Может поможет.
Удачи
 

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 11:42 16-06-2005
Tunga

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Собссно, получилось как обычно, пока объяснял проблему, сам все понял) Доходчиво написано вот тут: h__p://www.codeproject.com/win32/callback_adapter.asp
peacebird
Вызов
Код:
this->b->y(&A::x)
не скомпилируется - параметром метода y()ожидается указатель на функцию
Код:
void (*)(void*, bool);
, а этот вызов передает
Код:
void (A::*)(void*, bool);  

Всех благодарю за проявленное внимание

Всего записей: 19 | Зарегистр. 15-06-2005 | Отправлено: 12:51 16-06-2005
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование метода класса в качестве callback-функции


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru