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

C++泛型基类初始化方法及代码重构技术问询

重构事件系统:EventWrapper的正确实现与初始化方案

嘿,这个用多态替代union的重构思路真的很赞,能大幅提升代码的扩展性和可读性!咱们来一步步解决你遇到的问题:

一、EventWrapper(原EventImpl)的成员声明选择

你列出的三种写法里,只有第三种是符合多态设计目标的:

  • BaseEvent<T> event;:不可行,因为你的BaseEvent并非模板类,这个写法本身语法就不成立,而且也无法实现“存储不同子类事件”的需求。
  • T event;:不符合重构目标,如果硬要用这个,就回到了只能存单一类型事件的老路,完全失去了多态的灵活性,没法同时支持A/B/CEvent。
  • std::shared_ptr<BaseEvent> event;:正确选项!智能指针shared_ptr可以安全管理多态对象的生命周期,基类智能指针能指向任何继承自BaseEvent的子类实例,完美替代原union的“存储不同类型事件”的核心功能。

二、如何初始化泛型的BaseEvent子类

首先要修正BaseEvent的析构函数笔误(原代码写的是~EventDesc,应该是~BaseEvent),然后确保子类正确继承并传入类型哈希值:

class BaseEvent{
    size_t m_TypeHash;
public:
    using Ptr = std::shared_ptr<BaseEvent>;
    virtual ~BaseEvent() = default; // 修正析构函数名
    template <class T>
    static std::shared_ptr<T> Cast(const Ptr& src) {
        return src->m_TypeHash == typeid(T).hash_code() ? std::static_pointer_cast<T>(src) : nullptr;
    }
protected:
    BaseEvent(size_t typeHash) : m_TypeHash(typeHash){}
};

// 子类AEvent示例
class AEvent : public BaseEvent {
public:
    AEvent() : BaseEvent(typeid(AEvent).hash_code()) {}
    // 这里添加AEvent的专属成员和方法
};

// 同理实现BEvent、CEvent

接下来在EventWrapper里初始化event成员,有几种常见方式:

  1. 直接赋值初始化
struct EventWrapper {
    // 其他成员
    std::shared_ptr<BaseEvent> event;
};

// 使用时
EventWrapper wrapper;
wrapper.event = std::make_shared<AEvent>(); // 直接创建子类实例赋值
  1. 通过构造函数初始化
    如果希望EventWrapper创建时就必须绑定事件,可以给它加构造函数:
struct EventWrapper {
    // 其他成员
    std::shared_ptr<BaseEvent> event;

    // 显式构造函数,避免隐式转换
    explicit EventWrapper(std::shared_ptr<BaseEvent> evt) : event(std::move(evt)) {}
};

// 使用时
auto bEvt = std::make_shared<BEvent>();
EventWrapper wrapper(bEvt);

三、类型转换的使用示例

利用你在BaseEvent里定义的Cast模板,可以安全地将基类智能指针转换为子类指针:

EventWrapper wrapper(std::make_shared<CEvent>());

// 尝试转换为CEvent
auto cEvt = BaseEvent::Cast<CEvent>(wrapper.event);
if (cEvt) {
    // 处理CEvent的逻辑
    cEvt->doSomething();
} else {
    // 转换失败,处理异常逻辑
}

内容的提问来源于stack exchange,提问作者Jimmy W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:52:44