[問題] 將 class B 之 mem. func 塞到 class A 之 func.ptr

作者: EdisonX (卡卡獸)   2015-07-17 19:13:04
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
vs2010
問題(Question):
我想在自己的 class Display 實現 callback 功能 , 讓其他 class 使用
目前我想比較正式的方法應該是用 template 方式去做,但這份
class 要改成 template 的話有些工程,故想加上 function pointer 方式去做,
但發現好像不能塞其他 class 之 member function,
問題之程式碼簡化如下,
同步附 Code http://codepad.org/nT3XDA5q
//////
class Display
{
private:
void (*m_CallBackFunc)(int) ;
public:
Display( void (*CallBackFunc)(int) = NULL)
: m_CallBackFunc( CallBackFunc )
{
}
void ToUpdateDisplay(int iSel)
{
if(m_CallBackFunc)
if(rand() & 1) // some condition here
m_CallBackFunc(iSel);
}
};
///////
class PlaneDlg
{
private:
Display m_display;
public:
PlaneDlg ()
: m_display ( UpdateDisplay ) // <- 人是它殺的 ...
// : m_dysplay ( & PlaneDlg :: UpdateDisplay) // 這樣還是救不了它 ..
{
}
void UpdateDisplay(int iGrp)
{
// do something..
}
};
上述黃色部份我不知道該怎麼才能讓它過 ,
vs 的錯誤訊息是
'Display::Display(,void (__cdecl *)(int))' : 無法將參數 2 從 'void
(__thiscall PlaneDlg::* )(int)' 轉換成 'void (__cdecl *)(int)'
希望能動到最小的 Display ,去實現這個功能。
另也希望版友能針對此問題提供一些架構上的意見,
避開日後同樣的問題再重現。
非常感謝各位!
作者: shadow0326 (非議)   2015-07-17 19:26:00
UpdateDisplay改成global fun,或讓Display建構式能吃PlaneDlg的mem func
作者: EdisonX (卡卡獸)   2015-07-17 19:28:00
改 Global Func 知道怎做 , 但 Display 怎改 ctor 才能讓PlaneDlg 的 mem func 吃進來 ?
作者: shadow0326 (非議)   2015-07-17 19:46:00
typedef void (PlaneDlg::*cb_t)(int);cb_t m_CallBackFunc;Display(cb_t cb = NULL) : m_CallBackFunc(cb){}要呼叫m_CallBackFunc時要給物件的instance,所以ToUpdateDisplay那邊也會compile error而且基本上這段代碼有物件循環參考的問題 我不太確定你真正的使用方式為何 感覺應該可以用cb_fun+cb_data的慣用法寫得更乾淨才對建議context(天氣資料)明確區分出來 自成一個物件感覺沒有必要特地使用mem func ptr來作callbackmodel(天氣資料)-view(Display)-controller
作者: kevingwn (如雲如風的人生)   2015-07-17 22:33:00
不考慮多型? http://ideone.com/pEwTYa
作者: azureblaze (AzureBlaze)   2015-07-17 22:41:00
http://ideone.com/pE8z2L或是std::function + std::bind
作者: EdisonX (卡卡獸)   2015-07-17 22:56:00
感謝 kevinggwn 與 azureblaze , 你們提供的方案都可解決我的問題 , 謝謝
作者: LiloHuang (十年一刻)   2015-07-18 09:15:00
boost::function 也可以試試
作者: EdisonX (卡卡獸)   2015-07-18 12:31:00
@shadow0326 , 您說的物件循環相依問題我今天遇到了 ,用其他版友的方法可以避掉 , 謝謝.@LiloHuang,boost 比較尷尬,要安裝額外 lib 需要同意 @@
作者: LiloHuang (十年一刻)   2015-07-19 17:45:00
boost 裡頭的好東西可不少 XD license 也相當適合商用像是 Boost.Preprocessor 或是 Boost.MPL 都相當好用有興趣也可以看看介紹 https://goo.gl/X02gUp 誠心推薦

Links booklink

Contact Us: admin [ a t ] ucptt.com