主要是讓其他人方便使用又可以讓程式碼達到隱密性的要求…
一直以來只有使用像 AfxBeginThread、STL Sort 這類的 callback 經驗…
以致於忘了一些細節…剛好這次吃了點虧所以印像變深刻了…記錄一下…
Transmitter.h
// Transmitter.h
typedef void (*cbk_func)(int); // 回傳為 void 參數型態為 int
class CTransmitter
{
public:
cbk_func handler;
void go();
};
CallBackSampleDlg.h
// CallBackSampleDlg.h
class CCallBackSampleDlg : public CDialog
{
public:
static void CompletedHandeler(int nResult);
};
Transmitter.cpp
// Transmitter.cpp
void CTransmitter::go()
{
for(int i = 0; i < 101; i+=10)
{
handler(i);
Sleep(1000);
}
}
CallBackSampleDlg.cpp
// CallBackSampleDlg.cpp
void CallBackSampleDlg::OnBnClickedButtonTrans()
{
CTransmitter transmitter;
transmitter.handler = CallBackSampleDlg::CompletedHandeler;
transmitter.go();
}
void CallBackSampleDlg::CompletedHandeler(int nResult)
{
CString strMsg;
strMsg.Format(_T("已傳送 %d \%"), nResult);
MessageBox(strMsg);
}
其實重點在於 function point 只能是 static 或 global 的 function
否則在指定為 callback 目標時是會發生 compiler error 的…
理由是只有這兩種 function 才能在 compiler 時期就取得唯一的 point
同時也要注意 static function 內只能操作 static 的成員…
所以在設計需要 callback 的類別時要多注意點…
若 callback 的目標有必須為非 static 的需求…
就得利用傳物件的指標加上 interface 來解決嘍…
沒有留言:
張貼留言