Копирование связанных списков - это три вещи:
- Обход копируемого списка.
- Создание копий новых узлов из оригиналов.
- Для каждого нового узел из (2), привязать его к связанному списку.
Первый из них тривиальный, второй довольно базовый c, но третий часто бросает людей для всех oop. Для вашего copy-ctor один из способов сделать это - использовать указатель на указатель. Это позволяет нам обращаться к каждому указателю в нашем связанном списке по их собственным адресам.
List::List(const List& c)
: Head(nullptr)
, name(c.name)
{
Node *prev = nullptr;
Node **pp = &Head;
for (const Node *p = c.Head; p; p = p->Next)
{
// make a new node, storing its address at the
// pointer obtained by dereference of `pp`. the
// first iteration that will be the Head member.
*pp = new Node(*p);
(*pp)->Prev = prev;
prev = *pp;
// now just advance `pp` to point to the `Next`
// member of the node we just hung on the list.
pp = &(*pp)->Next;
}
*pp = nullptr; // terminate the list.
}
Это предполагает, что вы Node
класс поддерживает конструкцию копирования (это было лучше). но это все, что нужно. Исходя из этого, вы можете использовать идиому copy / swap для изготовления вашего оператора назначения копирования и иметь базовый класс списка соответствия правилу 1022 *.