एक गैर-बूस्ट प्रोजेक्ट में, मेरे पास एक कक्षा है जो एक निश्चित उपयोगकर्ता कार्रवाई (बटन दबाया/जारी) के आधार पर टाइमर का उपयोग करती है। मैं इस वर्ग को सामान्य बनाना चाहता हूं, इसलिए उपयोगकर्ता परिभाषित कार्यों के लिए कॉलबैक लेता है।असंबद्ध वर्गों के बीच सी ++ कॉलबैक कैसे पास करें?
// TimerClass.h
typedef void (*timerCallback)(void);
...
Class TimerClass : public CButton {
public:
void setCallbackShortTime(timerCallback clickFn) { shortCallback = clickFn;} ;
void setCallbackLongTime(timerCallback clickFn) { longCallback = clickFn;} ;
private:
timerCallback shortCallback, longCallback;
}
// CMyDlg.h
class CMyDlg : public CDialog
{
public:
void openLiveViewWindow();
void openAdminPanelWindow();
TimerClass _buttonSettings;
}
// CMyDlg.cpp
...
_buttonSettings.setCallbackShortTime(&openLiveViewWindow);
...
अब, एक और वर्ग (DialogClass) से मैं TimerClass उपयोग कर सकते हैं, लेकिन मैं कॉलबैक कार्यों के लिए समारोह संकेत पारित नहीं कर सकते हैं। ये कार्य स्थिर नहीं हैं। संकलक शिकायत समाप्त होता है:
error C2276: '&' : illegal operation on bound member function expression
कुछ शोध इस पर std::function()
और std::bind()
को बताया, लेकिन मैं इन से परिचित नहीं हूँ और यह कैसे हल करने पर कुछ संकेत की सराहना करेंगे।
संकल्प: किसी को दिलचस्पी के लिए, यहाँ अंतिम समाधान
// TimedButton.h
#include <functional>
// define timer callback prototype
typedef std::function<void()> timerCallback;
...
class TimedButton : public CButton
{
public:
TimedButton();
...
void setCallbackShortTime(timerCallback clickFn) { _shortCallback = clickFn;} ;
void setCallbackLongTime(timerCallback clickFn) { _longCallback = clickFn;} ;
private:
timerCallback _shortCallback;
timerCallback _longCallback;
}
// TimedButton.cpp
...
(_longCallback)(); // call long duration fn
...
(_shortCallback)(); // call short duration fn
// in MyDlg.cpp
#include <functional>
...
_buttonSettings.setCallbackShortTime(std::bind(&CMyDlg::openLiveViewWindow, this));
_buttonSettings.setCallbackLongTime(std::bind(&CMyDlg::openAdminPanelWindow, this));
सदस्य कार्यों के लिए कॉलबैक अंतर्निहित 'इस' पैरामीटर के कारण अलग-अलग व्यवहार करते हैं। –
विधियों को स्थिर किए बिना, आपको टाइमर के भीतर उदाहरण का संदर्भ रखना होगा। क्या आप सी ++ 11 का उपयोग कर रहे हैं? – jli
हम सी ++ 11 का उपयोग नहीं कर रहे हैं, लेकिन पिछले एक के रूप में हमारे पास 'tr1' फ़ंक्शन – fduff