如何无需传参让继承链中子类共享Application类已初始化的成员变量
核心问题分析
你当前的代码存在继承设计错误:Widget继承自Application的话,每次实例化Window、Button等子类时,都会独立创建一个全新的Application父类对象,和你在main函数里初始化的app实例完全是两个独立对象,自然拿不到已经赋值的mHInstance。
实现方案
我们可以通过单例模式改造Application,实现无参数共享全局初始化属性:
第一步:修改头文件定义
#include <Windows.h> class Application { private: // 静态全局唯一实例指针 static Application* s_instance; HINSTANCE mHInstance; public: Application(HINSTANCE); // 静态接口获取全局唯一实例 static Application* instance() { return s_instance; } // 暴露mHInstance获取接口 HINSTANCE getHInstance() const { return mHInstance; } int exec(); }; // 去掉Widget对Application的继承,避免多实例问题 class Widget { protected: HWND mHWnd; public: void show(); }; class Window: public Widget { public: Window(); };
第二步:修改实现代码
// 初始化Application静态成员 Application* Application::s_instance = nullptr; Application::Application(HINSTANCE hInstance) { mHInstance = hInstance; // 构造时绑定当前实例到静态指针 s_instance = this; }; // Window实现修改,直接获取全局单例的mHInstance Window::Window() { WNDCLASSEX wc = {0}; // 无需传参,直接调用静态接口获取已经初始化的HINSTANCE wc.hInstance = Application::instance()->getHInstance(); RegisterClassExW(&wc); };
第三步:主函数逻辑保持不变
#include <Windows.h> #include "../headers/gui.h" int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { Application app(hInstance); Window* wnd = new Window; wnd->show(); return app.exec(); }
补充说明
如果一定要保留原有Widget继承Application的层级结构,也可以直接把mHInstance设为Application的静态成员,构造时赋值静态变量后所有子类都可以直接访问,效果一致。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

