使用唯一指针的链表不会像我预期的那样 运行

Linked list using unique pointers won't run as I expected

我正在尝试使用唯一指针实现一个链表,我已经在 c 中做了数百万次,但似乎我无法让它工作!这个问题可能依赖于使用唯一指针,但我不确定为什么。

在下面的代码中,您会注意到两件事。一个 class Node 包含列表中每个元素的数据和一个 class LinkedList 实现的行为列表。

#include <iostream>
#include <memory>

using namespace std;


class Node
{

//Private variables.
private:
    std::unique_ptr<Node> next; //Next node.
    std::unique_ptr<Node> prev; //Previous node.


    //Int value.
    int value;



//Public variables.
public:

    //Constructor.
    Node(int v)
    :next(nullptr), prev(nullptr), value(v)
    {
    }


    //Set next node.
    void set_next(std::unique_ptr<Node> new_node)
    {
       next = std::move(new_node);
    }


    //Set previous node.
    void set_prev(std::unique_ptr<Node> new_node)
    {
        prev = std::move(new_node);
    }


    //Set value.
    void set_value(int v)
    {
        value = v;
    }


    //Get next node.
    std::unique_ptr<Node> get_next()
    {
        return std::move(next);
    }


    //Get previous node.
    std::unique_ptr<Node> get_prev()
    {
        return std::move(prev);
    }


    //Get value.
    int get_value()
    {
        return value;
    }



};


class LinkedList
{

//Private variables.
private:
    std::unique_ptr<Node> head;
    std::unique_ptr<Node> tail;



//Public variables.
public:

    //Constructor.
    LinkedList()
    :head(nullptr), tail(nullptr)
    {
    }


    //Append a item to the list.
    void append(int v)
    {

        //Creating a new node.
        std::unique_ptr<Node> new_node( new Node(v) );


        //If this is the very first node.
        if (head == nullptr || tail == nullptr)
            {
                head = std::move(new_node);
                tail = std::move(new_node);
            }



        //Append.
        else
            {
                tail -> set_next( std::move(new_node) ); //Linking the new node.
                new_node -> set_prev( std::move(tail) ); //Set the previous.
                tail = std::move(new_node);              //Update the tail.
            }

    }


    //Print all the elements.
    void print()
    {

        //Starting node.
        std::unique_ptr<Node>curr = std::move(head);


        //While Loop.
        while(curr != nullptr)
            {
                cout << curr -> get_value() << endl;
                curr = std::move( curr -> get_next() );
            }
    }

};


int main()
{
LinkedList myList;

myList.append(1);
myList.append(2);
myList.append(3);
myList.append(4);

myList.print();

return 0;
}

输出应该是 1,2,3,4 但实际上只有 4! 我做了调试,我发现了以下语句 是运行宁4次:

            //If this is the very first node.
        if (head == nullptr || tail == nullptr)
            {
                head = std::move(new_node);
                tail = std::move(new_node);
            }

但是为什么呢?第一次,headtail 将为空 但在那之后他们会指向某个地方所以这个声明永远不应该 再次运行。

std::unique_ptr 的一个基本 属性 是只有一个 std::unique_ptr 可以同时拥有给定的指针。这恰好是 "unique" 部分的全部内容。

std::unique_ptr<Node> new_node( new Node(v) );

好的。到目前为止一切顺利。

   head = std::move(new_node);
   tail = std::move(new_node);

那是你的问题。您正在尝试将相同的 std::unique_ptr 移动到另外两个。那行不通的。只有其中一个可以拥有一个指针。

将所有 std::unique_ptr 替换为 std::shared_ptr