Re: [问题] 将 class B 之 mem. func 塞到 class A 之 func.ptr

楼主: notBeing (read and be read)   2015-07-17 22:55:55
※ 引述《EdisonX (卡卡兽)》之铭言:
: 开发平台(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 Display
{
private:
void ( PlaneDlg::*m_CallBackFunc )(int);
PlaneDlg *m_P;
public:
Display( void ( PlaneDlg::*CallBackFunc )(int), PlaneDlg *P )
: m_P( P ), m_CallBackFunc( CallBackFunc )
{
}
void ToUpdateDisplay( int iSel )
{
if( m_CallBackFunc && m_P )
if( rand() & 1 )
( m_P->*m_CallBackFunc && m_P )( iSel );
}
class PlaneDlg
{
private:
Display m_display;
public:
PlaneDlg():
m_display( this, &::UpdateDisplay )
{
}
void UpdateDisplay( int iGrp )
{
//....
}
}
这样试看看, 人在外面不能测试XD
: ///////
: 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 ,去实现这个功能。
: 另也希望版友能针对此问题提供一些架构上的意见,
: 避开日后同样的问题再重现。
: 非常感谢各位!
作者: EdisonX (卡卡兽)   2015-07-17 22:57:00
谢谢,这方法是可行,只是考虑到 Display 可能不只让一个class 使用/包含 , 后来发现这种架构维护不易, 谢谢回复.
楼主: notBeing (read and be read)   2015-07-17 23:41:00
那就要用template啦

Links booklink

Contact Us: admin [ a t ] ucptt.com