0

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

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

4

5 回答 5

2

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

std::list<Event*> EventList;

或者

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

您不能存储对象列表,Event因为任何继承的对象都将被切片。基本上继承的部分将被切断。请参阅:什么是对象切片?

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

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

于 2013-04-03T09:43:00.813 回答
1

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

您不能在运行时更改列表的类型,但是如果您在其中存储指针,那么您可以利用虚拟调度让这些指针指向不同继承级别的对象。

于 2013-04-03T09:37:42.573 回答
1

您可以使列表成为Event指针列表;这些可以指向派生自Event(包括Event其自身)的任何类的实例。

unique_ptr我建议您使用类似or的智能指针类shared_ptr来简化内存管理。

例子:

list<shared_ptr<Event> > EventList;
于 2013-04-03T09:39:33.360 回答
0

这是多态性的情况。如果您的类SpecialEvent派生自Event您可以使用指针并在运行时动态确定它们的行为

std::list<Event*> EventList;

如果您有virtual方法,运行时将在运行时选择正确的方法。否则,您可能必须dynamic_cast<>在运行时使用才能获得正确的类型。

阅读这篇文章polymorphism

于 2013-04-03T09:38:58.727 回答
0

好吧,您将指针传递给add函数,您可以将这些指针存储在列表中而不是副本中。最好是智能指针,例如std::shared_ptr.

于 2013-04-03T09:39:03.763 回答