Редактирование старого кода, в котором я вручную обрабатывал время жизни вектора необработанных указателей для конкретных экземпляров абстрактного базового класса (ABC).How/Возможно ли иметь вектор <unique_ptr <ABC>>?
Так владелец вектора был виртуальный dtor который вручную прошел и удалил содержимое вектора и т.д.
Поскольку владелец вектора имеет элементы в ней, он делает много смысла, чтобы изменить это вектор unique_ptr.
К сожалению, кажется, это невозможно? Поскольку vector<unique_ptr<type>>
должен быть в состоянии иметь статический dtor для type
, но потому, что в данном случае тип является ABC, который не доступен, поэтому vector
не будет компилировать ...
Или я что-то отсутствует?
например:
struct ABC
{
ABC() = default;
virtual ~ABC() { } // need a vtable entry so that concrete subclasses will be deleted through the base dtor
virtual std::unique_ptr<ABC> Clone() = 0;
virtual void Foo() = 0;
std::vector<std::unique_ptr<ABC>> elements;
};
EDIT2: вот полный пример, который терпит неудачу:
#include <iostream>
#include <memory>
#include <vector>
struct ABC
{
virtual ~ABC() { } // need a vtable entry so that concrete subclasses will be deleted through the base dtor
virtual std::unique_ptr<ABC> Clone() = 0;
virtual void Foo() = 0;
std::vector<std::unique_ptr<ABC>> elements;
};
struct Child : ABC
{
std::unique_ptr<ABC> Clone() override { return std::make_unique<Child>(*this); }
void Foo() override { };
};
struct Derived : Child
{
std::unique_ptr<ABC> Clone() override { return std::make_unique<Derived>(*this); }
};
int main()
{
std::unique_ptr<ABC> x;
std::unique_ptr<ABC> c = std::make_unique<Child>();
std::vector<std::unique_ptr<ABC>> elements;
elements.emplace_back(std::make_unique<Derived>());
return 0;
}
Не уверен, что все остальные, но если вы используете одни и те же имена из примера кода в вопросе он делает то, что вы просите много понятнее , Тем не менее, какая ошибка вы получаете? Ваш код кода компилируется для меня. – NathanOliver
Не могли бы вы просто отправить объявление Base? Прямо перед тем, как вы это определите? –
Я получаю длинный набор сообщений от VS 2015 Upd 3, который в основном не создает экземпляр «элементов» по умолчанию для вектора из-за удаления ctor в Base (предположительно потому, что это ABC) – Mordachai