Callback-функции внутри класса
Модератор: Модераторы разделов
-
- Сообщения: 175
Callback-функции внутри класса
Во многих библиотеках (например, Jack, ODE) для обработки событий необходимо устанавливать коллбэки вида
int (void *) (args...).
Просто внутрь класса её не упрячешь - ссылка на функцию должна быть статической, будут ошибки при компиляции. Если пометить её как static, то невозможно будет получить доступ к остальным членам класса. То же самое, если вынести саму функцию из класса.
Как поступают в таких случаях?
int (void *) (args...).
Просто внутрь класса её не упрячешь - ссылка на функцию должна быть статической, будут ошибки при компиляции. Если пометить её как static, то невозможно будет получить доступ к остальным членам класса. То же самое, если вынести саму функцию из класса.
Как поступают в таких случаях?
-
- Сообщения: 423
- ОС: Basic command interpreter
Re: Callback-функции внутри класса
я делал статическую функцию и из нее вызывал метод класса и изнего доступ к членам
puts ("Working, please wait...");while(1);
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Callback-функции внутри класса
используют boost::bind? Как вариант можете создать свой собственный класс-функтор и использовать его.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Callback-функции внутри класса
Я так понял что ТС интересуется как вообще передавать callback-функции.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Callback-функции внутри класса
Я так понял, ТС интересуется, как передавать метод класса в качестве callback'а в стороннюю либу. Если сторонняя либа хочет int(void*)(args...), то boost::bind тут не к месту.
Мои розовые очки
-
- Сообщения: 175
Re: Callback-функции внутри класса
я делал статическую функцию и из нее вызывал метод класса и изнего доступ к членам
Нет, к сожалению не работает:
cannot call member function ‘jack_port_t* JackOutput::getPort()’ without object. И разве метод класса не является его членом?
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Callback-функции внутри класса
Obscurus, а использовать синглтоны вы можете?
-
- Администратор
- Сообщения: 5422
- ОС: Gentoo
Re: Callback-функции внутри класса
В большинстве "сторонних либ" есть возможность при установке callback'а указать один из передаваемых ему параметров, обычно называемый userdata.
т.е.:
void callback(int foo, bool bar, void* userdata) {
((SomeClass*)userdata) -> do_something(foo, bar);
}
...
set_callback(callback, this /* userdata */);
...
т.е.:
void callback(int foo, bool bar, void* userdata) {
((SomeClass*)userdata) -> do_something(foo, bar);
}
...
set_callback(callback, this /* userdata */);
...
-
- Сообщения: 423
- ОС: Basic command interpreter
Re: Callback-функции внутри класса
я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.
puts ("Working, please wait...");while(1);
-
- Администратор
- Сообщения: 5422
- ОС: Gentoo
Re: Callback-функции внутри класса
shotdownsystem писал(а): ↑07.12.2010 14:28я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.
Если вы не передали в статическую функцию указатель на экземпляр класса, с которым следует работать, то этому указателю взяться неоткуда, и то, что вы пишете - чушь. Если же передали, то с того, каким способом вы это сделали, и надо было начинать.
-
- Сообщения: 423
- ОС: Basic command interpreter
Re: Callback-функции внутри класса
/dev/random писал(а): ↑07.12.2010 14:56shotdownsystem писал(а): ↑07.12.2010 14:28я делал статическую вне класса функцию и из нее вызывал метод класса и изнего доступ к остальным членам.
Если вы не передали в статическую функцию указатель на экземпляр класса, с которым следует работать, то этому указателю взяться неоткуда, и то, что вы пишете - чушь. Если же передали, то с того, каким способом вы это сделали, и надо было начинать.
глобально (а есть еще варианты для общего случая ?!)
puts ("Working, please wait...");while(1);
-
- Администратор
- Сообщения: 5422
- ОС: Gentoo
Re: Callback-функции внутри класса
Для случая топикстартера (ode и jack) подходит вышеупомянутый вариант с userdata (обе библиотеки его поддерживают).
В общем же случае единственный вариант - jit-компиляция, например, с помощью LLVM. Но я сомневаюсь, что в природе существуют библиотеки, для которых это было бы необходимо.
-
- Сообщения: 175
Re: Callback-функции внутри класса
RasenHerz
Синглтоны помогли, спасибо! К своему стыду, я даже и не знал, что это такое.
Хотя на практике встречаться приходилось.
Синглтоны помогли, спасибо! К своему стыду, я даже и не знал, что это такое.

-
- Сообщения: 362
- Статус: Ad Astra per aspera
- ОС: openSUSE 11.4, Arch
Re: Callback-функции внутри класса
глупый вопрос, а зачем здесь синглтон? с userdata, имхо, самый удобный способ
No problems - just solutions!
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Callback-функции внутри класса
Ну если у требуемого класса существует всего один экземпляр то почему бы и нет?