PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] 将 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
诚心推荐
继续阅读
[问题] virtual function 请教
jono103
[问题] C++影像处理新手请益
jeff8231
[问题] 指标阵列 位址相同问题
a82
[问题] FOR的应用
ccccoooo
[问题] OpenCL请教
leoloveivy
[问题] float function
bjiyxo
[问题] 请问为什么无法编译
preciousIII
[问题] \n的问题
a82
Re: [问题] 程式考试时的拿捏
Feis
Re: [问题] 程式考试时的拿捏
EdisonX
Links
booklink
Contact Us: admin [ a t ] ucptt.com