Trong dự án không tăng cường, tôi có một lớp sử dụng bộ đếm thời gian dựa trên hành động của người dùng nhất định (nút được nhấn/phát hành). Tôi muốn lớp này chung chung, do đó, nó sẽ gọi lại cho các hành động do người dùng xác định.cách chuyển C++ callback giữa các lớp không liên quan?
// 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);
...
Bây giờ, từ một lớp khác (DialogClass) Tôi có thể sử dụng TimerClass nhưng tôi không thể chuyển con trỏ hàm đến chức năng gọi lại. Các hàm này không tĩnh. Trình biên dịch kết thúc lên phàn nàn:
error C2276: '&' : illegal operation on bound member function expression
Một số nghiên cứu về vấn đề này chỉ ra cho std::function()
và std::bind()
nhưng tôi không quen với những điều này và sẽ đánh giá cao một số gợi ý về cách giải quyết này.
GIẢI: Đối với bất cứ ai quan tâm, đây là những viên gạch của giải pháp cuối cùng
// 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));
gọi lại cho các chức năng thành viên hoạt động khác nhau do tham số 'this' ẩn. –
Nếu không thực hiện các phương thức tĩnh, bạn cần giữ tham chiếu đến cá thể trong bộ hẹn giờ. Bạn đang sử dụng C++ 11? – jli
chúng tôi không sử dụng C++ 11, nhưng trước đó chúng ta có tập hợp các chức năng 'tr1' – fduff