我有一个基本上包含事件列表的类(其中事件是另一个类)
#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将特殊事件放入列表中,我想知道这样做的正确方法是什么?有没有一种方法可以在不定义类型的情况下创建列表,以便可以在运行时设置类型(在我的情况下为event或specialevent)?
答案 0 :(得分:2)
您必须存储指针列表,而不是对象列表。例如:
std::list<Event*> EventList;
或
std::list<shared_ptr<Event>> EventList;
您无法存储Event
个对象的列表,因为任何继承的对象都会被切片。基本上,继承的部分将被切断。请参阅:What is object slicing?
因为您正在存储指针,所以现在存在内存管理问题。您必须确定您的EventPacket
对象是否应取得对象的所有权,然后删除它们或者调用代码是否应删除它们。
要解决此问题,您可能需要查看智能指针,例如unique_ptr
和shared_ptr
。您对所有权语义做出的决定将决定智能指针是否有用,如果有,则选择哪一个。
答案 1 :(得分:1)
阅读C ++书中关于多态的章节。
您无法在运行时更改列表的类型,但如果您在其中存储指针,则可以使用虚拟调度使这些指针指向不同继承级别的对象。 / p>
答案 2 :(得分:1)
您可以将列表设为Event
指针列表;这些可以指向从Event
派生的任何类的实例(包括Event
本身)。
我建议你使用像unique_ptr
或shared_ptr
这样的智能指针类来简化内存管理。
示例:
list<shared_ptr<Event> > EventList;
答案 3 :(得分:0)
这是多态性的情况。如果你的类SpecialEvent
派生自Event
,你可以使用指针并在运行时动态确定它们的行为
std::list<Event*> EventList;
如果您有virtual
个方法,运行时将在运行时选择正确的方法。否则,您可能必须使用dynamic_cast<>
在运行时获取正确的类型。
阅读polymorphism
上的this文章。
答案 4 :(得分:0)
您传递指向add
函数的指针,您可以将这些指针存储在列表中而不是副本中。优选地是智能指针,例如std::shared_ptr
。