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();
};

これまでのところ、これはうまく機能します。しかし今、Event クラスの拡張である別のクラス SpecialEvent があります。特別なイベントをリストに入れるために同じクラス EventPacket を使用したいのですが、これを行う正しい方法は何ですか? タイプ (私の場合は event または specialevent) を実行時に設定できるように、タイプを定義せずにリストを作成する方法はありますか?

4

5 に答える 5

2

オブジェクトのリストではなく、ポインターのリストを格納する必要があります。例えば:

std::list<Event*> EventList;

また

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

Event継承されたオブジェクトはすべてスライスされるため、オブジェクトのリストを保存することはできません。本質的に継承された部分は切り取られます。参照:オブジェクトのスライスとは?

ポインタを格納しているため、メモリ管理の問題が発生しています。EventPacketオブジェクトがオブジェクトの所有権を取得してから削除するか、呼び出し元のコードでオブジェクトを削除するかを決定する必要があります。

unique_ptrこれを解決するには、やなどのスマート ポインターを調べるとよいでしょうshared_ptr。所有権のセマンティクスに関する決定によって、スマート ポインターが役立つかどうか、有用な場合はどれを選択するかが決まります。

于 2013-04-03T09:43:00.813 に答える
1

Eventリストをポインターのリストにすることができます。これらは、(それ自体Eventを含む)から派生した任意のクラスのインスタンスを指すことができます。Event

unique_ptrまたはのようなスマート ポインター クラスを使用して、shared_ptrメモリ管理を簡素化することをお勧めします。

例:

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

関数にポインターを渡すと、addこれらのポインターをコピーではなくリストに格納できます。のようなスマートポインタが望ましいstd::shared_ptrです。

于 2013-04-03T09:39:03.763 に答える