Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается передать указатель на функцию 
V
    Опции темы
Vetos
  Дата 21.2.2017, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Здравствуйте! Столкнулся с такой проблемой. 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); 
     }


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

Это сообщение отредактировал(а) Vetos - 21.2.2017, 14:48


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
xvr
Дата 21.2.2017, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
Vetos
Дата 21.2.2017, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



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


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Alexeis
Дата 21.2.2017, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



std::bind/std::function не?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 22.2.2017, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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

или для старого стандарта можете попробовать std::mem_fun_ref.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1192 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.