我有一个基本上包含事件列表的类(其中事件是另一个类)
#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_ptr
和 shared_ptr
。您对所有权语义所做的决定将决定智能指针是否有用,如果有用,则选择哪一个。
关于c++ - 如何在运行时设置列表的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783751/