Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не получается передать указатель на функцию


Автор: Vetos 21.2.2017, 14:41
Здравствуйте! Столкнулся с такой проблемой. Eсть класс который обрабатывает нажатия на экран и в случае попадания нажатия в зону области вызывает функцию которую заранее получает по указателю:

Код

namespace Controllers{

typedef void(*controller_CALLBACK)(Controllers::TapController * controller, float x, float y);

typedef struct TapController_{
      controller_CALLBACK callback;
      void setCallback(controller_CALLBACK func);
      
      void update(float x, float y){
            if(Точка в зоне)callback(this,x,y);
      }
}TapController;


Гдето в другом модуле:

Код

namespace NativeKeyboard{

typedef struct Keyboard_{
     void keyDown(Controllers::TapController * controller, float x, float y){
          бла бла бла
     }
     void initialize(){
          TapController * ctrl = new TapController;
          ctrl->setCallback(keyDown);  <----------------------------------А тут ошибка
     } 
}


И вот тут возникает ошибка:    reference to non-static member function must be called.
При навелдении мыши на подчеркивание пишет что : значение типа "void (NativeKeyboard::Keyboard::*)(Controllers::TapController controller, float x, floay y)" нельзя присвоить сущности типа "Controllers::controller_CALLBACK"

Вообщем пока писал вопрос, дошло и решение. Это происходит потому что передается не конкретная функция а описание функции в классе. Может кто сформулирует правильно, незнаю как обьяснить:)
Нужно просто делать так:

Код

     void initialize(){
          TapController * ctrl = new TapController;
          ctrl->setCallback(this->keyDown); 
     }


Ан нет, это только подчеркивание ушло, а ошибка при компиляции все равно возникает. Так что может все таки есть решение этой проблемы?

Автор: xvr 21.2.2017, 18:45
Вынесите описание функции из вашей структуры, или напишите перед ней static, если выносить не хотите

Автор: Vetos 21.2.2017, 21:07
В том то и проблема, что выносить из структуры не хочу, функция использует переменные структуры. Если делать static, то и все переменные она просит статик, может можно сделать всю структуру статик чтобы не приписывать static к каждой переменной??

Автор: Alexeis 21.2.2017, 23:31
std::bind/std::function не?

Автор: azesmcar 22.2.2017, 11:44
Цитата(Vetos @  21.2.2017,  21:07 Найти цитируемый пост)
функция использует переменные структуры

а откуда функция должна знать про эти переменные, если вы ей не передаете this?

Цитата(Vetos @  21.2.2017,  14:41 Найти цитируемый пост)
ctrl->setCallback(keyDown);  <----------------------------------А тут ошибка

Это естественно, так-как Вы хотите вызвать member функцию, а в не статические member функции необходимо передавать объект this.
В вашем случае он не передается. Необходимо чтобы либо callback знал для какого объекта вызывается функция, либо нужно делать bind еще до момента передачи callback-а, т.е. по сути сделать из не статической member-функции - обычную функцию.

используйте
Цитата(Alexeis @  21.2.2017,  23:31 Найти цитируемый пост)
std::bind/std::function

или для старого стандарта можете попробовать http://en.cppreference.com/w/cpp/utility/functional/mem_fun_ref.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)