In un progetto non boost, ho una classe che utilizza un timer basato su una determinata azione dell'utente (pulsante premuto/rilasciato). Voglio questa classe generica, quindi accetta le callback per le azioni definite dall'utente.come passare i callback C++ tra classi non correlate?
// 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);
...
Ora, da un'altra classe (DialogClass) posso usare il TimerClass ma non posso passare puntatori a funzione per le funzioni di callback. Queste funzioni non sono statiche. Il compilatore finisce per lamentarsi:
error C2276: '&' : illegal operation on bound member function expression
qualche ricerca su questo rilevare a std::function()
e std::bind()
ma io non sono familiarità con questi e apprezzerebbe alcune indicazioni su come risolvere questo.
RISOLUZIONE: Per chiunque sia interessato, qui ci sono i mattoni della soluzione finale
// 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));
i callback per le funzioni membro si comportano diversamente a causa del parametro implicito 'this'. –
Senza rendere statici i metodi, è necessario mantenere un riferimento all'istanza all'interno del timer. Stai usando C++ 11? – jli
non stiamo usando C++ 11, ma quello precedente come abbiamo il set di funzioni 'tr1' – fduff