首先:我在网上搜索了一半,找到了this作为最接近的解决方案的答案。但是,对于我来说,它太重了,所以我看起来不太复杂。
那么,在某种情况下:我正在构建一个系统,该系统应该能够处理来自队列的传入消息,然后将这些消息的结果存储在另一个队列中。我想将这些响应存储在通用类中,因为我将其存储在multimap
中。
当前的响应类定义如下
class COutboundMsg
{
public:
enum eTypeHint {
thNone,
thSomeType,
thLast
};
eTypeHint m_TypeHint;
void* m_OutboundData;
COutboundMsg(COutboundMsg::eTypeHint TypeHint, void* data);
};
COutboundMsg::COutboundMsg(COutboundMsg::eTypeHint TypeHint, void* data) :
m_TypeHint(TypeHint),
m_OutboundData(data)
{
}
现在,当前的工作方式将涉及用户执行以下操作:
CSomeType* data = new CSomeType();
COutboundMsg(COutboundMsg::thSomeType , (void*) data);
另一端的用户将
void*
转换回CSomeType*
(使用类型提示)并删除它。它不喜欢它。
我宁愿在
auto_ptr
或其他内容中包含m_OutboundData,并确保完成后将其删除。有任何想法吗?也许是完全不同的方法
最佳答案
通常,多态性用于这样的系统。可以放入“出站”队列中的任何项目都从QueueItem
派生,并且该队列包含QueueItem*
或指向QueueItem
的智能指针。
由于所有项目均来自同一基础,因此您可以安全地删除QueueItem*
或允许智能指针对其进行处理。这种方法还允许您使用dynamic_cast
来确保指针实际上指向您认为是该类型的对象。
如果可以采用这种方法,请确保将QueueItem
析构函数设为虚拟,否则将不会调用派生类的析构函数。