c++ - 如何在运行时设置列表的类型?

标签 c++ list

我有一个基本上包含事件列表的类(其中事件是另一个类)

#include "event.h"
#include <list>

class EventPacket
{

private:
    int max_size;

public:
    std::list<Event> EventList;
    EventPacket();
    ~EventPacket();

    void add(Event *event);
    int size();
    void sort();
    int merge(EventPacket *ep);
    void clear();
};

到目前为止,一切正常。但是现在,我有另一个类 SpecialEvent,它是 Event 类的扩展。我想使用相同的类 EventPacket 将特殊事件放入列表中,我想知道这样做的正确方法是什么?有没有一种方法可以在不定义其类型的情况下创建列表,以便可以在运行时设置类型(在我的例子中是事件或特殊事件)?

最佳答案

您必须存储指针列表,而不是对象列表。例如:

std::list<Event*> EventList;

std::list<shared_ptr<Event>> EventList;

您不能存储 Event 对象的列表,因为任何继承的对象都将被切片。本质上继承的部分会被砍掉。请参阅:What is object slicing?

因为你正在存储指针,所以你现在有一个内存管理问题。您必须决定您的 EventPacket 对象是否应该取得这些对象的所有权然后删除它们,或者调用代码是否应该删除它们。

要解决这个问题,您可能需要研究智能指针,例如 unique_ptrshared_ptr。您对所有权语义所做的决定将决定智能指针是否有用,如果有用,则选择哪一个。

关于c++ - 如何在运行时设置列表的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783751/

相关文章:

c++ - Qt QList C3892 : cannot assign to a variable that is const

c++ - 对于 boost-asio 网络编程,处理响应的最佳方法是什么?

c++ - 线程创建操作是否暗示发生在关系之前?

java - 使用java递归搜索Hashmap列表中的值

python - 创建数据框时限制元组列表中的列

forms - Member_Label 中的 Ruby on Rails Formtastic 多个选项

list - 判断给定元素是否在 double 列表中

Python:从有序列表中删除不在无序列表中的条目

c++ - 需要 C 和 C++ 中的未定义行为吗?

c++ - 快速而肮脏的方式来分析你的代码