2013-02-23 3 views
0

나는 간단한 UI 클래스가 있으며 각 요소의 콜백에 UI 요소 인스턴스를 보내야하므로 콜백을 호출 한 요소를 자바 스크립트에서 조작 할 수 있습니다.
콜백으로 등록 된 함수에 this의 인스턴스를 보내야합니다. 어떻게해야합니까?
현재 상태 : '이 인스턴스를 콜백 매개 변수로 보내기

bool buttonCallback(Opencv_Button*but, void*param) { 
    but->val("I was clicked!!!"); 
} 
+0

정확히 그 일을 할 때의 문제점은 무엇입니까? –

+0

문제는 'this'가 참조 자체이기 때문에 '& this'가 오류를 반환한다는 것입니다. 그리고 나는 변수를 취소하는 방법을 보지 못합니다. –

+0

@ TomášZato'this'는 포인터 인'Opencv_Button *'입니다. –

답변

1

당신에게 : 나는 콜백 같은 것을 할 수 있습니다, 그래서

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; 
} 

: 이제

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 (*callback)(Opencv_Button*, void*); 
void setCallback(bool(*)(Opencv_Button*, void*), void*); 

을 그리고 콜 : 빠른 수정 확인 콜백 포인터를 소요하고 this을 통과하는 것입니다 그러나

callback(this, callback_param); 

, 당신은 가능성이 참조를 사용하여 더 나을 것입니다.

bool buttonCallback(Opencv_Button& but, void* param) { 
    but.val("I was clicked!!!"); 
} 
+0

마지막 코드 예제에서 클래스 멤버에 액세스하는 데'.'을 사용하지 않겠습니까? 어쨌든, 이것은 답변입니다. 나는 포인터 메카니즘을 더 잘 이해하고 참조가 나를 혼란스럽게하기 때문에'pointer'를 사용하기로 결정했습니다. 하지만 두 가지 옵션을 게시 해 주셔서 감사합니다! –

+0

@ TomášZato 사과, 네 말이 맞아. 그러나 참조를 사용하는 것이 훨씬 낫습니다. 원시 포인터는 C++에서 필요한 경우에만 사용해야합니다. –

+0

포인터 대신 참조를 사용해야한다고 주장하는 이유가 무엇입니까? 나는 이미 내가 참조에 관한 모든 것을 알지 못한다고 말했다. 그래서 나는 그들의 장점에 대한 흥미로운 기사를 읽을 것이다. –

0

로 콜백을 정의 : 다음

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

로 전화 : 같이 표시됩니다

callback(*this, callback_param); 

그리고 당신의 buttonCallback 당신은 당신의 기능 Opencv_Button에 대한 참조를 취할 수 있습니다

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

그리고 모든 일이 잘 진행됩니다.

관련 문제