将此实例作为回调参数发送

Send this instance as callback parameter

本文关键字:参数 回调 实例      更新时间:2023-10-16

我有一个简单的UI类,我需要将UI元素实例发送到每个元素的回调,这样我就可以(很像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*);

一切都很顺利。