Аналог оператора присваивания для 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 можете почитать тут

→ Ссылка