Вы не можете иметь два std::unique_ptr
, указывающих на один и тот же объект.unique_ptr
подразумевает уникальное владение.
Если вам нужно разделить владение, используйте вместо него std::shared_ptr
s.В вашем примере это должна быть вставная замена, просто измените объявление using
:
using Elements = std::vector<std::shared_ptr<Element>>;
Если вы не хотите, чтобы Inner
объекты владели объектами, на которые указываетего _vec
член, тогда это должен быть вектор необработанных указателей:
class Outer
{
void call()
{
std::vector<Element*> observer;
std::transform(_vec.begin(), _vec.end(), std::back_inserter(observer),
[](std::unique_ptr<Element>& el) { return el.get(); });
_inner.aMethod(observer);
}
//...
};
class Inner
{
// ...
void aMethod(std::vector<Element*> vec)
{
_vec = std::move(vec);
}
private:
std::vector<Element*> _vec;
};
Конечно, это будет означать, что вы рискуете оставить элементы _vec
висящими, если Outer
освобождает любой из Element
s, которыми он владеет, без обновления каких-либо Inner
объектов, указывающих на них.Вы могли бы частично уменьшить этот риск, сохранив указатель на объект Outer
вместо хранения указателей непосредственно на Element
s:
class Outer
{
void call()
{
_inner.aMethod(this);
}
//...
};
class Inner
{
// ...
void aMethod(Outer* outer)
{
outer_ = outer;
}
private:
Outer* outer_;
};
Inner
только тогда получит доступ к его Element
s черезобъект Outer
(при необходимости вы можете сделать Inner
a friend
из Outer
).Это все еще оставляет возможность того, что объект Inner
может пережить объект Outer
, на который он указывает, но это несколько снижает риск.