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成员,有几种常见方式:
- 直接赋值初始化
struct EventWrapper { // 其他成员 std::shared_ptr<BaseEvent> event; }; // 使用时 EventWrapper wrapper; wrapper.event = std::make_shared<AEvent>(); // 直接创建子类实例赋值
- 通过构造函数初始化
如果希望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
相关产品推荐
相关产品推荐

