You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需传参让继承链中子类共享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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:54:01