WinAPI C++开发中如何从Child子类调用MainClass的display方法
实现方案
核心逻辑是让子控件类持有主类MainClass的有效指针,通过构造函数注入的方式传入即可直接调用主类公共方法,修改成本最低,适配你的现有代码结构。
具体修改步骤
- 第一步:在
Child1、Child2类定义前添加MainClass的前置声明,避免头文件循环引用问题 - 第二步:给两个子类新增私有成员变量存储主类指针,修改构造函数接收主类指针完成初始化
- 第三步:主类创建子类实例时,将自身的
this指针传入子类构造函数 - 第四步:子类的
someMethod中直接通过存储的主类指针调用display()方法
修改后完整可运行代码
#include <string> using namespace std; // 前置声明MainClass class MainClass; class Child1{ private: MainClass* m_mainInstance; public: Child1(MainClass* mainPtr): m_mainInstance(mainPtr){} ~Child1(){ /* 资源清理逻辑 */ } void addControls(){ // 原有控件创建逻辑 } void someMethod(){ // 直接调用主类display方法 m_mainInstance->display(); } }; class Child2{ private: MainClass* m_mainInstance; public: Child2(MainClass* mainPtr): m_mainInstance(mainPtr){} ~Child2(){ /* 资源清理逻辑 */ } void addControls(){ // 原有控件创建逻辑 } void someMethod(){ m_mainInstance->display(); } }; class MainClass{ public: string currentWindow; Child1* Child1Win = nullptr; Child2* Child2Win = nullptr; void display(){ clear(); if(currentWindow == "child1"){ // 传入主类自身指针 Child1Win = new Child1(this); Child1Win->addControls(); } if(currentWindow == "child2"){ Child2Win = new Child2(this); Child2Win->addControls(); } } void clear(){ delete Child1Win; Child1Win = nullptr; delete Child2Win; Child2Win = nullptr; } };
WinAPI场景补充说明
因为你开发的是WinAPI应用,按钮点击触发的是系统消息回调,回调函数通常为全局或静态方法,无法直接访问类成员,建议做如下适配:
调用CreateWindowEx创建按钮时,将子类指针或主类指针通过最后一个参数lpParam传入,在窗口过程的WM_CREATE消息中取出指针,调用SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)指针)存储到控件属性中,后续按钮点击的WM_COMMAND消息回调里就能通过GetWindowLongPtr取出指针,调用对应的display方法。
额外优化建议
你的原有代码中删除指针后没有置空,存在野指针重复释放的风险,上面的代码已经做了指针初始化和删除后置空的优化,你可以直接参考。
内容的提问来源于stack exchange,提问作者Artrm Kovalchuk
相关产品推荐
相关产品推荐

