Форум программистов, компьютерный форум CyberForum.ru

Как правильно передать метод в качестве функции возврата? - C++

Восстановить пароль Регистрация
 
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 17:56     Как правильно передать метод в качестве функции возврата? #1
Здравствуйте!

Вот такая проблема, надо передать указатель на метод класса в библиотечную функцию

C++
1
_s16 CiSetCB(_u8 chan, _u8 ev, void (*ci_handler) (_s16));
Прототип функции указатель на которую передаётся

C++
1
void ci_handler(_s16 ev);
У меня есть класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyClass
{
public:
// Различные объявления
//...
// Функция для обратного вызова
void cbrcv(_s16 sig);
 
// Поля класса
int someVar;
// Методы класса
void someMethod();
};
 
void MyClass::cbrcv(_s16 sig)
{
// Работа с членами класса
anyFunc(someVar);
// Работа с методами класса
someMethod();
}
Как правильно передать указатель на функцию cbrcv в функцию CiSetCB?

Такой вариант не работает

C++
1
CiSetCB(chan, ev, (void (*)(_s16))&MyClass::cbrcv);
Заранее спасибо за помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
24.11.2011, 18:10     Как правильно передать метод в качестве функции возврата? #2
Тут несколько вопросов. Если функция нестатическая, то она должна вызываться через объект. Вы это учли?

Что касается вызова, то поробуйте следующую конструкцию

C++
1
2
3
4
5
6
#include   <functional>
....
int main()
{
   CiSetCB(chan, ev, std::mem_fun( &MyClass::cbrcv) );
}
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 19:18  [ТС]     Как правильно передать метод в качестве функции возврата? #3
В том то и проблема, что она должна вызываться через объект, а вызывающая функция из библиотеки вызывает просто функцию, без указания объекта.

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

Сейчас попробую ваш вариант

Добавлено через 6 минут
ошибка: cannot convert 'std::mem_fun1_t<void, MyClass, short int>' to 'void (*)(short int)' for argument '3' to 'short int CiSetCB(unsigned char, unsigned char, void (*)(short int))'
Сыроежка
Заблокирован
24.11.2011, 19:26     Как правильно передать метод в качестве функции возврата? #4
lyubimov,

Надо знать, как эта функция-член класса вызывается внутри той функции, который вы хотите передать параметр. Может быть она там вызывается через указатель на объект?
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 19:40  [ТС]     Как правильно передать метод в качестве функции возврата? #5
Она в библиотеке определена, не знаю как там вызывается. А в примерах только глобальные функции туда передаются.
Сыроежка
Заблокирован
24.11.2011, 19:43     Как правильно передать метод в качестве функции возврата? #6
Цитата Сообщение от lyubimov Посмотреть сообщение
Она в библиотеке определена, не знаю как там вызывается. А в примерах только глобальные функции туда передаются.
А если в примерах передаются только глобальные функции, то как вы собираетесь-то вызывать нестатическую функцию - член класса, о чем я вас спрашивал с самого начала? Вы ведь должны еще каким-то образом передать объект, для которого функция будет вызываться.
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 20:01  [ТС]     Как правильно передать метод в качестве функции возврата? #7
Да, вот это я и хотел выяснить, возможно ли передать нестатическую функцию или нет. А почему с помощью mem_fun не получается?

А где можно найти информацию по функциям из functional?

Добавлено через 6 минут
Если ставить глобальную функцию, то из неё всё равно надо вызывать методы класса, а значит надо определять глобальный указатель на объект, который будет использоваться в глобальной функции.
И таких глобальных указателей должно быть равно количеству объектов.
Сыроежка
Заблокирован
24.11.2011, 20:04     Как правильно передать метод в качестве функции возврата? #8
Цитата Сообщение от lyubimov Посмотреть сообщение
Да, вот это я и хотел выяснить, возможно ли передать нестатическую функцию или нет. А почему с помощью mem_fun не получается?

А где можно найти информацию по функциям из functional?

Добавлено через 6 минут
Если ставить глобальную функцию, то из неё всё равно надо вызывать методы класса, а значит надо определять глобальный указатель на объект, который будет использоваться в глобальной функции.
И таких глобальных указателей должно быть равно количеству объектов.
Потому тчто я был не внимателен и дал не правильный совет. У вас функция не является шаблонной и имеет конкретное определение третьего параметра. Поэтому ей нельзя в качестве этого параметра передавать объект класса, что делает mem_fun. Вы должны передать аргумент, который имеет такой же тип, как и параметр.
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 20:09  [ТС]     Как правильно передать метод в качестве функции возврата? #9
Понятно, значит только через глобальный функции можно с такой библиотекой работать?
Сыроежка
Заблокирован
24.11.2011, 20:17     Как правильно передать метод в качестве функции возврата? #10
Цитата Сообщение от lyubimov Посмотреть сообщение
Понятно, значит только через глобальный функции можно с такой библиотекой работать?
Если эта библиотека ничего не знает о тех классах и объектах, которые вы в своем коде создаете, то конечно. Ведь чтобы вызвать нестатическую функцию - член класса, ей нужен ваш объект.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2011, 20:22     Как правильно передать метод в качестве функции возврата?
Еще ссылки по теме:

Функции: Как передать в качестве параметра число? C++
C++ Как передать функции в качестве параметра исполняемый код
Как в качестве аргумента функции передать массив? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lyubimov
1 / 1 / 0
Регистрация: 24.11.2011
Сообщений: 24
24.11.2011, 20:22  [ТС]     Как правильно передать метод в качестве функции возврата? #11
Спасибо большое за ответ, буду использовать статические функции.
Yandex
Объявления
24.11.2011, 20:22     Как правильно передать метод в качестве функции возврата?
Ответ Создать тему
Опции темы

Текущее время: 21:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru