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

时间:2013-04-03 09:35:02

标签: 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将特殊事件放入列表中,我想知道这样做的正确方法是什么?有没有一种方法可以在不定义类型的情况下创建列表,以便可以在运行时设置类型(在我的情况下为event或specialevent)?

5 个答案:

答案 0 :(得分:2)

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

std::list<Event*> EventList;

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

您无法存储Event个对象的列表,因为任何继承的对象都会被切片。基本上,继承的部分将被切断。请参阅:What is object slicing?

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

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

答案 1 :(得分:1)

阅读C ++书中关于多态的章节。

您无法在运行时更改列表的类型,但如果您在其中存储指针,则可以使用虚拟调度使这些指针指向不同继承级别的对象。 / p>

答案 2 :(得分:1)

您可以将列表设为Event指针列表;这些可以指向从Event派生的任何类的实例(包括Event本身)。

我建议你使用像unique_ptrshared_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