Callback-функции внутри класса

Модератор: Модераторы разделов

Obscurus
Сообщения: 175

Callback-функции внутри класса

Сообщение Obscurus »

Во многих библиотеках (например, Jack, ODE) для обработки событий необходимо устанавливать коллбэки вида
int (void *) (args...).
Просто внутрь класса её не упрячешь - ссылка на функцию должна быть статической, будут ошибки при компиляции. Если пометить её как static, то невозможно будет получить доступ к остальным членам класса. То же самое, если вынести саму функцию из класса.
Как поступают в таких случаях?
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Callback-функции внутри класса

Сообщение shotdownsystem »

я делал статическую функцию и из нее вызывал метод класса и изнего доступ к членам
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Callback-функции внутри класса

Сообщение RasenHerz »

используют boost::bind? Как вариант можете создать свой собственный класс-функтор и использовать его.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Callback-функции внутри класса

Сообщение watashiwa_daredeska »

RasenHerz писал(а):
06.12.2010 13:02
используют boost::bind?
boost::bind — это не int(void*)(args...).
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Callback-функции внутри класса

Сообщение RasenHerz »

watashiwa_daredeska писал(а):
06.12.2010 13:31
boost::bind — это не int(void*)(args...).

Я так понял что ТС интересуется как вообще передавать callback-функции.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Callback-функции внутри класса

Сообщение watashiwa_daredeska »

RasenHerz писал(а):
06.12.2010 14:56
Я так понял что ТС интересуется как вообще передавать callback-функции.
Я так понял, ТС интересуется, как передавать метод класса в качестве callback'а в стороннюю либу. Если сторонняя либа хочет int(void*)(args...), то boost::bind тут не к месту.
Спасибо сказали:
Obscurus
Сообщения: 175

Re: Callback-функции внутри класса

Сообщение Obscurus »

я делал статическую функцию и из нее вызывал метод класса и изнего доступ к членам

Нет, к сожалению не работает:
cannot call member function ‘jack_port_t* JackOutput::getPort()’ without object. И разве метод класса не является его членом?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Callback-функции внутри класса

Сообщение RasenHerz »

Obscurus, а использовать синглтоны вы можете?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5422
ОС: Gentoo

Re: Callback-функции внутри класса

Сообщение /dev/random »

В большинстве "сторонних либ" есть возможность при установке callback'а указать один из передаваемых ему параметров, обычно называемый userdata.

т.е.:

void callback(int foo, bool bar, void* userdata) {
((SomeClass*)userdata) -> do_something(foo, bar);
}
...
set_callback(callback, this /* userdata */);
...
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Callback-функции внутри класса

Сообщение shotdownsystem »

Obscurus писал(а):
06.12.2010 23:25
я делал статическую функцию и из нее вызывал метод класса и изнего доступ к членам

Нет, к сожалению не работает:
cannot call member function ‘jack_port_t* JackOutput::getPort()’ without object. И разве метод класса не является его членом?

я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.

puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5422
ОС: Gentoo

Re: Callback-функции внутри класса

Сообщение /dev/random »

shotdownsystem писал(а):
07.12.2010 14:28
я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.

Если вы не передали в статическую функцию указатель на экземпляр класса, с которым следует работать, то этому указателю взяться неоткуда, и то, что вы пишете - чушь. Если же передали, то с того, каким способом вы это сделали, и надо было начинать.
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Callback-функции внутри класса

Сообщение shotdownsystem »

/dev/random писал(а):
07.12.2010 14:56
shotdownsystem писал(а):
07.12.2010 14:28
я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.

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

глобально (а есть еще варианты для общего случая ?!)
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5422
ОС: Gentoo

Re: Callback-функции внутри класса

Сообщение /dev/random »

shotdownsystem писал(а):
07.12.2010 15:10
глобально (а есть еще варианты для общего случая ?!)

Для случая топикстартера (ode и jack) подходит вышеупомянутый вариант с userdata (обе библиотеки его поддерживают).

В общем же случае единственный вариант - jit-компиляция, например, с помощью LLVM. Но я сомневаюсь, что в природе существуют библиотеки, для которых это было бы необходимо.
Спасибо сказали:
Obscurus
Сообщения: 175

Re: Callback-функции внутри класса

Сообщение Obscurus »

RasenHerz
Синглтоны помогли, спасибо! К своему стыду, я даже и не знал, что это такое. :blush: Хотя на практике встречаться приходилось.
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: Callback-функции внутри класса

Сообщение agentprog »

Obscurus писал(а):
08.12.2010 11:03
Синглтоны помогли, спасибо!

глупый вопрос, а зачем здесь синглтон? с userdata, имхо, самый удобный способ
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Callback-функции внутри класса

Сообщение RasenHerz »

agentprog писал(а):
08.12.2010 18:59
глупый вопрос, а зачем здесь синглтон? с userdata, имхо, самый удобный способ

Ну если у требуемого класса существует всего один экземпляр то почему бы и нет?
Спасибо сказали: