Объекты, поддерживающие итератор, в std :: list - PullRequest
1 голос
/ 17 июня 2020

У меня есть список объектов:

std::list<A> objects;

Чтобы запустить асинхронную c операцию, которая удалит их из списка на основе некоторого условия, объекты должны знать свое местоположение в списке:

A::A(std::list<A>::iterator it);

Как передать итератор конструктору при добавлении элементов в список?

objects.emplace(<the iterator to new item>);

Инициализация итератора-члена class A не может быть выполнена позже, даже конструктор может инициировать операцию удаления, поэтому ему нужен этот член во время построения.

Возможные решения, которые я подумал (вносит дополнительную сложность):

1:

objects.emplcae(A(objects.end())); // dummy object
A a{ std::prev(objects.end()) };
std::swap(a, object.back());

2:

objects.emplace();
objects.back().set_iterator(std::prev(objects.end()));
objects.back().run(); // Moved the work from constructor to this function (against RAII)

3: Попробуйте получить итератор на основе адреса this.

1 Ответ

3 голосов
/ 17 июня 2020

Существует проблема с курицей и яйцом, которую вы должны решить: класс A хочет, чтобы итератор был готов до создания объекта, в то время как итератор предполагает, что какой-то элемент уже построен.

Одним из способов решения этой проблемы является введение дополнительного уровня косвенности, например, чтобы вместо этого хранить не экземпляры A, а указатели (интеллектуальные указатели). Другой способ - использовать размещение new: сначала выделить элемент в list без создания объекта (просто выделить память), затем построить объект на месте с предоставленным итератором. Самым простым решением было бы разделить по времени построение A и установку итератора (A::setIterator(std::list<A>::iterator&) метод).

Я бы также рекомендовал вам реализовать это как метод Factory, который принимает список ( все ингредиенты), и делает все эти подверженные ошибкам вещи в одном месте. Метод Factory должен быть другом A, а конструктор A::A должен быть закрытым. Это предотвратит использование других неверных способов построения A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...