Предположим, что у меня есть класс, как это:Указав (не) передача права собственности с unique_ptr
class Node {
public:
Node(Node* parent = 0) : mParent(parent) {}
virtual ~Node() {
for(auto p : mChildren) delete p;
}
// Takes ownership
void addChild(Node* n);
// Returns object with ownership
Node* firstChild() const;
// Does not take ownership
void setParent(Node* n) { mParent = n; }
// Returns parent, does not transfer ownership
Node* parent() const { return mParent; }
private:
list<Node*> mChildren;
Node* mParent;
};
Я бы сейчас хотел бы использовать смарт-указатели и/или ссылки на RValue, чтобы указать, где собственность и не является переданы.
Мое первое предположение заключалось бы в изменении mChildren
, чтобы содержать unique_ptr
s, адаптируя сигнатуры функций следующим образом.
// Takes ownership
void addChild(unique_ptr<Node> n);
// Returns object with ownership
unique_ptr<Node>& firstChild() const;
// Does not take ownership
void setParent(Node* n) { mParent = n; }
// Returns parent, does not transfer ownership
Node* parent() const { return mParent; }
Теперь, это будет своего рода проблематичным, когда мне нужно передать результат в Node::firstChild()
к некоторой функции, которая наблюдает, но не брать на себя ответственность, так как я должен был бы явно вызвать .get()
на unique_ptr
, который, как я понимаю, не рекомендуется.
Каков правильный и рекомендуемый способ указать право собственности с использованием unique_ptr
, не прибегая к использованию .get()
и проходящего вокруг голых указателей?
Почему бы не передать его функции как ссылку на const unique_ptr? Таким образом, функция может заглянуть в нее, и никакая копия не будет сделана. – JBL
@ JBL, поскольку, например, 'parent()' возвращает не уникальный указатель, то есть мне придется перегружать каждую функцию для сырых и уникальных указателей. – Symaxion