1.1 关于在mfc中定义函数指针,被指向的那个函数必须是全局函数吗?能是类的成员函数吗?
2条回答 默认 最新
关注让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。
如果答案能帮助您,请采纳,非常感谢!
.
每日一句正能量,让它带给您好心情:别让别人的评价,左右你的人生,你才是自己的主角。
.关于在MFC中定义函数指针
函数指针指向全局函数 vs 成员函数
1. 指向全局函数
可以直接使用普通函数指针指向全局函数:
// 全局函数声明 void GlobalFunction(int param); // 函数指针定义 typedef void (*PFN_GlobalFunc)(int); // 使用示例 PFN_GlobalFunc pFunc = GlobalFunction; pFunc(123); // 调用全局函数2. 指向类的成员函数
不能直接用普通函数指针指向类的成员函数,因为成员函数有隐含的
this指针参数。需要使用成员函数指针:class CMyClass { public: void MemberFunction(int param); static void StaticMemberFunction(int param); }; // 成员函数指针定义 typedef void (CMyClass::*PFN_MemberFunc)(int); // 使用示例 CMyClass obj; PFN_MemberFunc pMemberFunc = &CMyClass::MemberFunction; (obj.*pMemberFunc)(123); // 通过对象调用成员函数3. 静态成员函数
静态成员函数可以像全局函数一样使用:
// 静态成员函数指针 typedef void (*PFN_StaticMemberFunc)(int); // 使用示例 PFN_StaticMemberFunc pStaticFunc = &CMyClass::StaticMemberFunction; pStaticFunc(123); // 直接调用静态成员函数在MFC中的实际应用
使用
std::function和std::bind(推荐)#include <functional> class CMyMFCClass : public CWnd { public: void OnButtonClick(); std::function<void()> GetCallback() { return std::bind(&CMyMFCClass::OnButtonClick, this); } };使用MFC的消息映射机制
// 在头文件中 class CMyDialog : public CDialog { public: afx_msg void OnButtonClick(); DECLARE_MESSAGE_MAP() }; // 在实现文件中 BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnButtonClick) END_MESSAGE_MAP()总结
- 全局函数:可以直接用普通函数指针指向
- 成员函数:需要使用成员函数指针,调用时需要对象实例
- 静态成员函数:可以像全局函数一样使用
- 推荐做法:在现代C++中,建议使用
std::function和std::bind来处理回调函数,代码更清晰安全
在MFC开发中,通常更推荐使用消息映射机制来处理事件回调,这是MFC框架的标准做法。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报