Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие Callback функции и класса, Нужно вызывать метод класса, а dll вызыв 
V
    Опции темы
Belerafon
Дата 10.8.2012, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



Доброго времени суток. Вопрос. Есть самый нижний по иерархии класс MyClass. Он использует внешнюю dll библиотеку, а в та должна вызывать callback функцию по событию. Как обработать эту колбек функцию в классе? По понятным причинам повесить на колбек метод класса я не могу. Приходится создавать обычную функцию, передавать её dll в качестве колбека, а в этой функции уже вызывать нужный мне метод класса, например Read(). Так как MyClass глубокий по вложенности в другие классы, приходится вызывать в callback функции MyClass3->MyClass2->MyClass1->MyClass->Read(); 
А так как эту колбек функцию я расположил в одном файле вместе с MyClass, мне приходится еще инклудить кучу лишних заголовочников, чтобы можно было обратиться ко всем классам, начиная с самого верхнего.
Как можно сделать более грамотно? Как обычно это делают? Класс MyClass у меня в программе в одном экземпляре и размножение экземпляров не предвидится. Метод Read() статическим сделать не могу, так как он использует внутренние переменные класса.
PM MAIL   Вверх
mes
Дата 10.8.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



[Б]Белерафон[/Б], сигнатура длл-колбяка какая ? с воид* ?



--------------------
PM MAIL WWW   Вверх
korian
Дата 11.8.2012, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Обычно в ANSI C call_back функцию можно передать параметр.
И выглядет это обычно примерно так:
class MyClass {
...
   static void call_back(void * param)
   {
       MyClass *obj = static_cast<MyClass *>(param);
       obj->Read();
   }
...
}

Если в вашем случае это не так, то надо знать более конкретно, что у вас там происходит.

PM   Вверх
Belerafon
Дата 11.8.2012, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



В моем случае у dll есть функция для установки колбека
Код

SetCallback(void (*callback_handler) (int));


Я делаю свою Си-функцию с такими параметрами (вне класса!)

Код

void My_Callback(int type)
{
     MyClass3->MyClass2->MyClass1->MyClass->Read(type); 
}


И при инициализации библиотеки туда её передаю: 
Код

SetCallback(My_Callback);


Библиотека - не моя, дополнительных параметров в колбек я вставить не могу. В идеальном случае хотелось бы, чтобы можно было вызывать не My_Callback, а сразу MyClass->Read(type);  передав этот метод библиотеке в виде
Код

SetCallback(MyClass->Read);

Понятно, что так делать нельзя, но для меня так было бы наиболее красиво по коду... По логике программы этот callback относится только к нижнему классу MyClass, и совсем не хочется в функции этого колбека вызывать Read(type) через всю иерархию классов и получать потом проблемы в виде "поменял имя MyClass2 на MySuperClass2 и иди меняй его в вызове колбека в файле, относящемся к классу MyClass". И вообще неправильно знакомить самый нижний класс MyClass со всеми заголовочниками всей программы, чтобы в колбеке можно было осуществить вызов MyClass3->MyClass2->MyClass1->MyClass->Read(type); 

Это сообщение отредактировал(а) Belerafon - 11.8.2012, 08:10
PM MAIL   Вверх
mes
Дата 11.8.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



заведите переменную, в которой будете регистрировать  тот обьект класса, которoму  колбяк должен передать вызов.. Исходя из вашего описания, колбяк и регистрирующую переменную удобнее сделать статическими членами класса..

Добавлено @ 10:02
Цитата(Belerafon @  11.8.2012,  07:04 Найти цитируемый пост)

Понятно, что так делать нельзя,... 

слишком много воды, за которой не видно истных намерений.. 


Это сообщение отредактировал(а) mes - 11.8.2012, 16:04


--------------------
PM MAIL WWW   Вверх
Belerafon
Дата 11.8.2012, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



Да, со статическими членами получилось всё. Не догадался, что статические методы класса можно передать в колбек. Спасибо!

Это сообщение отредактировал(а) Belerafon - 11.8.2012, 11:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.