在一個非boost項目中,我有一個使用基於某個用戶操作(按鈕按下/釋放)的計時器的類。我想這個類是通用的,所以它需要回調用戶定義的操作。現在如何在不相關的類之間傳遞C++回調?
// 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));
由於隱含'this'參數,成員函數的回調行爲會有所不同。 – 2012-08-13 18:32:39
不使這些方法成爲靜態的,你需要在定時器中保持對實例的引用。你在使用C++ 11嗎? – jli 2012-08-13 18:34:08
我們沒有使用C++ 11,但是前面的一個,因爲我們有'tr1'函數集 – fduff 2012-08-13 18:42:47