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

C++框架如何实例化用户自定义的派生类?

C++实现类似Android Activity的应用框架方案

C++没有原生反射机制,但可以通过静态注册+全局对象、模板入口或者宏辅助的方式实现类似Android中框架自动实例化子类的效果,以下是几种可行方案:

方案一:静态注册+全局对象(最接近Android模式)

核心思路是让用户的自定义类通过静态注册的方式把自身的创建函数注册到框架的全局注册表中,框架启动时从注册表获取并实例化。

框架核心代码(BasicApp.h)

#include <functional>
#include <unordered_map>
#include <string>

class BasicApp {
public:
    virtual ~BasicApp() = default;
    virtual void onCreate() {}
    virtual void onRun() {}
    virtual void onDestroy() {}

    // 框架提供的注册接口
    using AppCreator = std::function<BasicApp*()>;
    static void registerApp(const std::string& appName, AppCreator creator);
    
    // 框架启动入口,实例化注册的主App
    static void startApp(const std::string& appName = "MainApp");

private:
    static std::unordered_map<std::string, AppCreator>& getRegistry();
};

框架实现(BasicApp.cpp)

#include "BasicApp.h"
#include <iostream>

std::unordered_map<std::string, BasicApp::AppCreator>& BasicApp::getRegistry() {
    static std::unordered_map<std::string, AppCreator> registry;
    return registry;
}

void BasicApp::registerApp(const std::string& appName, AppCreator creator) {
    getRegistry()[appName] = creator;
}

void BasicApp::startApp(const std::string& appName) {
    auto it = getRegistry().find(appName);
    if (it == getRegistry().end()) {
        std::cerr << "App " << appName << " not registered!" << std::endl;
        return;
    }

    BasicApp* app = it->second();
    if (app) {
        app->onCreate();
        app->onRun();
        app->onDestroy();
        delete app;
    }
}

用户自定义App的实现

用户只需继承BasicApp,并通过全局对象完成注册:

#include "BasicApp.h"
#include <iostream>

class AppMain : public BasicApp {
public:
    void onCreate() override {
        std::cout << "AppMain onCreate" << std::endl;
    }

    void onRun() override {
        std::cout << "AppMain running..." << std::endl;
    }

    void onDestroy() override {
        std::cout << "AppMain onDestroy" << std::endl;
    }
};

// 静态注册:全局对象在程序启动时自动调用注册函数
static bool registerMyApp = []() {
    BasicApp::registerApp("MainApp", []() { return new AppMain(); });
    return true;
}();

程序入口(main.cpp)

#include "BasicApp.h"

int main() {
    BasicApp::startApp();
    return 0;
}

方案二:模板化入口(简化注册)

如果不需要多App切换的场景,可以用模板直接指定用户的自定义类,框架直接实例化:

框架修改后的启动入口

// 在BasicApp.h中添加模板启动函数
template<typename AppClass>
static void startTemplateApp() {
    static_assert(std::is_base_of_v<BasicApp, AppClass>, "AppClass must inherit from BasicApp");
    AppClass* app = new AppClass();
    app->onCreate();
    app->onRun();
    app->onDestroy();
    delete app;
}

用户使用方式

// main.cpp中直接指定自定义类
#include "BasicApp.h"
#include "AppMain.h"

int main() {
    BasicApp::startTemplateApp<AppMain>();
    return 0;
}

方案三:宏辅助注册(简化用户代码)

可以用宏封装注册逻辑,让用户代码更简洁,类似Android的Activity声明:

定义注册宏(BasicApp.h中添加)

#define REGISTER_MAIN_APP(AppClass) \
    static bool register_##AppClass = []() { \
        BasicApp::registerApp("MainApp", []() { return new AppClass(); }); \
        return true; \
    }();

用户使用时只需添加宏

class AppMain : public BasicApp {
    // ... 重写方法 ...
};

REGISTER_MAIN_APP(AppMain)

关键说明

  • 静态注册方案的核心是利用全局对象的构造函数在程序启动时自动执行的特性,完成子类的注册,实现类似Android Manifest的声明效果。
  • 模板方案更轻量,适合单App场景,无需注册逻辑。
  • 宏方案进一步简化用户代码,降低使用门槛。

内容的提问来源于stack exchange,提问作者Michael Ziegler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:32:22