![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Belerafon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.7.2007 Репутация: нет Всего: нет |
Доброго времени суток. Вопрос. Есть самый нижний по иерархии класс MyClass. Он использует внешнюю dll библиотеку, а в та должна вызывать callback функцию по событию. Как обработать эту колбек функцию в классе? По понятным причинам повесить на колбек метод класса я не могу. Приходится создавать обычную функцию, передавать её dll в качестве колбека, а в этой функции уже вызывать нужный мне метод класса, например Read(). Так как MyClass глубокий по вложенности в другие классы, приходится вызывать в callback функции MyClass3->MyClass2->MyClass1->MyClass->Read();
А так как эту колбек функцию я расположил в одном файле вместе с MyClass, мне приходится еще инклудить кучу лишних заголовочников, чтобы можно было обратиться ко всем классам, начиная с самого верхнего. Как можно сделать более грамотно? Как обычно это делают? Класс MyClass у меня в программе в одном экземпляре и размножение экземпляров не предвидится. Метод Read() статическим сделать не могу, так как он использует внутренние переменные класса. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
[Б]Белерафон[/Б], сигнатура длл-колбяка какая ? с воид* ?
|
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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(); } ... } Если в вашем случае это не так, то надо знать более конкретно, что у вас там происходит. |
|||
|
||||
Belerafon |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.7.2007 Репутация: нет Всего: нет |
В моем случае у dll есть функция для установки колбека
Я делаю свою Си-функцию с такими параметрами (вне класса!)
И при инициализации библиотеки туда её передаю:
Библиотека - не моя, дополнительных параметров в колбек я вставить не могу. В идеальном случае хотелось бы, чтобы можно было вызывать не My_Callback, а сразу MyClass->Read(type); передав этот метод библиотеке в виде
Понятно, что так делать нельзя, но для меня так было бы наиболее красиво по коду... По логике программы этот callback относится только к нижнему классу MyClass, и совсем не хочется в функции этого колбека вызывать Read(type) через всю иерархию классов и получать потом проблемы в виде "поменял имя MyClass2 на MySuperClass2 и иди меняй его в вызове колбека в файле, относящемся к классу MyClass". И вообще неправильно знакомить самый нижний класс MyClass со всеми заголовочниками всей программы, чтобы в колбеке можно было осуществить вызов MyClass3->MyClass2->MyClass1->MyClass->Read(type); Это сообщение отредактировал(а) Belerafon - 11.8.2012, 08:10 |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
заведите переменную, в которой будете регистрировать тот обьект класса, которoму колбяк должен передать вызов.. Исходя из вашего описания, колбяк и регистрирующую переменную удобнее сделать статическими членами класса..
Добавлено @ 10:02 слишком много воды, за которой не видно истных намерений.. Это сообщение отредактировал(а) mes - 11.8.2012, 16:04 |
|||
|
||||
Belerafon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.7.2007 Репутация: нет Всего: нет |
Да, со статическими членами получилось всё. Не догадался, что статические методы класса можно передать в колбек. Спасибо!
Это сообщение отредактировал(а) Belerafon - 11.8.2012, 11:41 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |