【发布时间】:2021-01-05 21:03:34
【问题描述】:
我正在尝试重写一些旧代码以使其更加面向对象。以前我有一个 struct 的 union,比如 Event
union Event {
AEvent aEvent;
BEvent bEvent;
CEvent cEvent;
}
这个Event 稍后在结构中使用
struct EventImpl {
... //some other members
Event event();
}
现在我正在尝试使用强大的shared_ptr;
我创建了一个名为BaseEvent的新基类
class BaseEvent{
size_t m_TypeHash;
public:
using Ptr = std::shared_ptr<BaseEvent>;
virtual ~EventDesc() = default;
template <class T>
// cast to different events
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、BEvent 和 CEvent 可以扩展 BaseEvent,这使得代码更简洁。
但是问题出现了,我该如何处理包含Event 的结构EventImpl?有没有办法初始化一个通用的BaseEvent?
struct EventImpl {
... //some other members
BaseEvent<T> event; //??
T event; // ??
std::shared_ptr<BaseEvent> event; // ???
}
编辑:
EventImpl 这个名字有点误导,正如 Dmitry 指出的那样,EventWrapper 认为更合适。 :)
【问题讨论】:
-
不要混合模板和继承。任选其一。
-
模板在正确使用时可以很好地继承。我感到困惑的是“BaseEvent”。您将它定义为一个类,然后在 EventImpl 中使用它,就像它是一个模板一样
-
@Joe,你说得对,我打算使用类继承。我仍在尝试学习 C++。 :p
-
常见的模式是将
EventImpl作为Event的隐藏实现。你反其道而行之。 -
现代联合是
std::variant(C++17)
标签: c++ oop c++11 dynamic-memory-allocation