首先:我在网上搜索了一半,找到了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析构函数设为虚拟,否则将不会调用派生类的析构函数。

10-04 12:06