Аналог оператора присваивания для shared_ptr
Возник вопрос. У меня реализован класс односвязный список List и внутренний Node. Изначально я реализовывал этот класс не используя умных указателей, но мне понадобилось их использовать. И проблема, что для shared_ptr не перегружен оператор присваивания. Например в моем классе есть поле
shared_ptr<Node> head;
и компилятор ругается на такую вот конструкцию
head=new Node(data);
Или, например, мой элемент списка (Node) содержит умный указатель типа shared_ptr на следующий элемент pNext. И вот такой код тоже не работает, ибо отсутствует перегрузка оператора =.
shared_ptr<Node> current=this->head;
while (current->pNext != nullptr)
{
current = current->pNext;
}
current->pNext= new Node(data);
Можно ли как с обычными указателями брать и присваивать значения? Как это сделать? Надеюсь, достаточно полно описал проблему.
Ответы (1 шт):
Строчками:
shared_ptr<Node> head;
head = new Node(data);
Вы пытаетесь присвоить умному указателю, обычный указатель. Вам нужно создать умный указатель на элемент и его уже присваивать другому умному указателю. Этого можно добиться при помощи функции make_shared<T>
Вот пример:
shared_ptr<Node> head;
head = make_shared<Node>(Node(data));
//В вашем случае можно писать
//head = make_shared<Node>(data);
Во втором примере аналогично. На строчке:
current->pNext= new Node(data);
Вы так же присваиваете умному указателю, обычный указатель и так же можно решить это при помощи функции make_shared<Node>.
current->pNext = make_shared<Node>(Node(data));
//Или так current->pNext = make_shared<Node>(data);
Так же вы можете использовать функцию reset
Например:
head.reset(new Node(data));
//или
current->pNext.reset(new Node(data));
Различия между reset и make_shared можете почитать тут