std::list
に大量のオブジェクトを格納しようとしています。スマートポインタと派生クラス
さまざまな種類のデータを格納するオブジェクトが必要なので、派生クラスのどのオブジェクトにキャストするかを示すenum
型の属性を保持する基本クラスへのポインタを格納します。各派生クラスは、データの独自のタイプがあります。各ベースオブジェクトは、それがどうあるべきかを入力知っていながら、しかし
std::list<std::unique_ptr<Base>> list;
list.push_back(std::unique_ptr<Base>(new D1("Somestring")));
list.push_back(std::unique_ptr<Base>(new D2(3.14)));
:これらのオブジェクトへのポインタを保持するために
struct Base {
enum class Type {
D1,
D2,
...
} type;
Base(Type new_type):
type(new_type) {}
};
struct D1: public Base {
std::string data;
D1(std::string new_data):
Base(Base::Type::D1), data(new_data) {}
};
struct D2: public Base {
double data;
D2(double new_data):
Base(Base::Type::D2), data(new_data) {}
};
を、私はスマートポインタを使用していますキャストされて正しく削除された場合、スマートポインタはBaseのデストラクタを呼び出さなければならないことしか知らない。各サブクラスに割り当てられたメモリを削除しないままにします。
カスタムオブジェクトをスマートポインタに渡して、各オブジェクトのメモリを適切にキャストして解放する方法を知るにはどうすればよいですか?私はそのカスタムデリゲーターを実装する必要がありますか?
カスタムデリターではなく、 'Base'の' virtual'デストラクタはどうですか? –