0

単純な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!!!");
}
4

2 に答える 2

1

あなたはかなり近いです。簡単な修正は、コールバックがポインターを受け取り、渡すことを確認することです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!!!");
}
于 2013-02-23T13:56:12.297 に答える
0

コールバックを次のように定義します

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

そしてすべてがうまくいきます。

于 2013-02-23T13:56:21.797 に答える