Отправить этот экземпляр как параметр обратного вызова

У меня есть простой класс пользовательского интерфейса, и мне нужно отправить экземпляр элемента пользовательского интерфейса для обратных вызовов для каждого элемента, поэтому я могу (так же, как в 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!!!");
}

0

Решение

Ты довольно близко Быстрое решение состоит в том, чтобы убедиться, что ваш обратный вызов принимает указатель, и вы передаете 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!!!");
}
1

Другие решения

Определите обратный вызов как

bool (*callback)(Opencv_Button*, void*);

и все идет хорошо.

0

По вопросам рекламы [email protected]