Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将此实例作为回调参数发送_C++_Callback_This Pointer - Fatal编程技术网

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

C++ 将此实例作为回调参数发送,c++,callback,this-pointer,C++,Callback,This Pointer,我有一个简单的UI类,我需要将UI元素实例发送给每个元素的回调,这样我就可以(很像在javascript中)操作调用回调的元素。 这需要将此的实例发送到注册为回调的函数。我该怎么做? 当前状态: class Opencv_Button { private: bool (*callback)(void*); //Callback WITHOUT the current button isntance //bool(*callback)(Opencv_

我有一个简单的UI类,我需要将UI元素实例发送给每个元素的回调,这样我就可以(很像在javascript中)操作调用回调的元素。
这需要将此的实例发送到注册为回调的函数。我该怎么做?
当前状态:

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!!!");
}
因此,我可以在回调中执行如下操作:

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!!!");
}

你很接近。快速修复方法是确保回调函数使用指针,然后传递

bool (*callback)(Opencv_Button*, void*);
void setCallback(bool(*)(Opencv_Button*, void*), void*);
并致电:

callback(this, callback_param);
不过,使用引用可能会更好。您可以让函数引用
Opencv\u按钮

bool (*callback)(Opencv_Button&, void*);
void setCallback(bool(*)(Opencv_Button&, void*), void*);
然后用以下词语来称呼它:

callback(*this, callback_param);
您的
按钮callback
将如下所示:

bool buttonCallback(Opencv_Button& but, void* param) {
  but.val("I was clicked!!!");
}
将回调定义为

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

一切都很顺利。

这样做到底有什么问题?问题是
&这个
返回错误,因为
这个
本身就是引用。我看不到一种取消变量校验的方法。@TomášZato
这个
是一个
Opencv_按钮*
-一个指针。在上一个代码示例中,您不使用
访问类成员吗?不管怎样,这就是答案。我决定使用
指针
,因为我更了解指针机制,而且引用让我感到困惑。但感谢您发布这两个选项@汤姆·亚什扎托道歉,你说得对。但是,使用引用会更好。原始指针只需在C++中使用。如果你坚持使用引用而不是指针,有没有原因?我已经说过,我不确定我对参考资料的所有知识都了解,所以我一定会读一些关于它们优点的有趣文章。