У меня есть простой класс пользовательского интерфейса, и мне нужно отправить экземпляр элемента пользовательского интерфейса для обратных вызовов для каждого элемента, поэтому я могу (так же, как в javascript) манипулировать элементом, который вызвал обратный вызов.
Для этого требуется отправить экземпляр this
к функции, зарегистрированной как обратный вызов. Как я могу это сделать?
Текущее состояние:
class Opencv_Button {
private:
bool (*callback)(void*); //Callback WITHOUT the current button isntance
//bool(*callback)(Opencv_Button, void*); //this is CALLBACK I WANT instead
void* callback_param; //parameter set by user
bool state;
bool mouse(int, int, int);
public:
Opencv_Button(int, int, int, int);
void setCallback(bool(*)(void*), void*);
//void setCallback(bool(*)(Opencv_Button, void*), void*); //This is what I WANT TO USE
void draw(Mat*, bool);
void val(const char*);
char value[30];
};
Теперь есть функция, которая вызывает обратный вызов:
bool Opencv_Button::mouse(int mx, int my, int button)
{
if(/*click conditions satisfied*/)
{
/*CLICK!!!*/
if(callback!=0)
callback(callback_param);
/*Instead I WANT:*/
//callback(*this/*some THIS instance*/, callback_param);
return true;
}
return false;
}
Итак, я могу сделать что-то вроде этого в обратном вызове:
bool buttonCallback(Opencv_Button*but, void*param) {
but->val("I was clicked!!!");
}
Ты довольно близко Быстрое решение состоит в том, чтобы убедиться, что ваш обратный вызов принимает указатель, и вы передаете this
:
bool (*callback)(Opencv_Button*, void*);
void setCallback(bool(*)(Opencv_Button*, void*), void*);
И позвоните с:
callback(this, callback_param);
Тем не менее, вы, вероятно, лучше использовать ссылки. Вы можете сделать так, чтобы ваша функция ссылалась на Opencv_Button
:
bool (*callback)(Opencv_Button&, void*);
void setCallback(bool(*)(Opencv_Button&, void*), void*);
Затем позвоните с помощью:
callback(*this, callback_param);
И ваш buttonCallback
будет выглядеть так:
bool buttonCallback(Opencv_Button& but, void* param) {
but.val("I was clicked!!!");
}
Определите обратный вызов как
bool (*callback)(Opencv_Button*, void*);
и все идет хорошо.