繁体   English   中英

std::list 中的迭代器感知对象

[英]Iterator aware objects in std::list

我有一个对象列表:

std::list<A> objects;

为了触发异步操作,根据某些条件将它们从列表中删除,对象需要知道它们在列表中的位置:

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的地址获取迭代器。

您必须解决一个先有鸡还是先有蛋的问题: A class 希望迭代器在 object 构建之前准备好,而迭代器假定某种元素已经构建。

解决此问题的一种方法是引入额外的间接级别,例如,不是存储A的实例,而是存储指针(智能指针)。 另一种方法是使用placement new :首先在list中分配一个项目而不构造object(只分配内存),然后使用提供的迭代器就地构造object。 最简单的解决方案是及时分离A的构造和设置迭代器( A::setIterator(std::list<A>::iterator&)方法)。

我还建议您将其实现为一个工厂方法,该方法采用一个列表(所有成分),并在一个地方完成所有这些容易出错的事情。 Factory 方法应该是A的友元,而构造函数A::A应该是私有的。 这将防止您使用其他不正确的方式来构造A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM