非ブーストプロジェクトでは、特定のユーザーアクション(ボタンの押下/離し)に基づいてタイマーを使用するクラスがあります。私はこのクラスを一般的なものにしたいので、ユーザー定義のアクションのコールバックを受け取ります。無関係のクラス間で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'パラメータの動作が異なります。 –
メソッドを静的にすることなく、タイマー内のインスタンスへの参照を保持する必要があります。 C++ 11を使用していますか?我々は、このために必要な機能を持っていたtr1'機能 – jli
。場合にのみ、今、私はそう、私はきれいで、明確な、あなたの質問... – fduff