尝试从双链表打印数据时 C++ 程序崩溃

标签 c++ object linked-list

我正在尝试使用所有 shared_ptr 从双链表打印节点的数据,但是使用打印函数输出数据导致程序崩溃。我不知道为什么当我尝试打印它时它会崩溃。我的 Insert 函数有问题吗?

template <typename T>
class Node
{
   private:
      T data;
      shared_ptr<Node<T>> next;
      shared_ptr<Node<T>> prev;

   public:
      Node() { next = NULL; prev = NULL; data = 0; }
      Node(T value) { next = NULL; prev = NULL; data = value; }
      T getData() { return data; }
      shared_ptr<Node<T>> getNext() { return next; }
      shared_ptr<Node<T>> getPrev() { return prev; }

};

template <typename T>
class DoubleLinkedList
{
   private:
      shared_ptr<Node<T>> head;
      shared_ptr<Node<T>> tail;
   public:
      DoubleLinkedList()
      {
         head = NULL;
         tail = NULL;
         total = 100;
         for (int i = 0; i < total; i++)
         {
            Insert(objectgetsinsertedhere);
         }
      }

      void print()
      {
         shared_ptr<Node<T>> temp;
         temp = tail;
         temp = temp->getPrev();
         cout << temp->getData().getName();  // getName() is a getter to get the name of the object
      }


      void Insert(T data)
      {
         T value(data);

         if (head == NULL)
         {
            head = make_shared<Node<T>>(data);
            tail = head;
         }
         else
         {
            shared_ptr<Node<T>> nu = make_shared<Node<T>>(data);
            nu->getPrev() = tail;
            if (head == tail)
               head->getNext() = nu;
            tail->getNext() = nu;
            tail = nu;
         }
      }
};

最佳答案

您在 Insert 中的分配没有按照您的意愿进行。 这些调用:

nu->getPrev() = tail;
if (head == tail)
    head->getNext() = nu;
tail->getNext() = nu;

都返回 next 和 prev 字段内容的拷贝。访问器(get/set)创建一个新的 shared_ptr 对象并用 prev 和 next 字段的当前值初始化它们。当您重新分配这些复制的 shared_ptr 的内容时,您不会操纵节点的状态。

所以你应该对普通字段(prevnext)进行操作,返回对访问器中字段的引用(如 shared_ptr>& getNext() { return next; }) 或为字段添加 setter 方法并使用它们。

关于尝试从双链表打印数据时 C++ 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36761370/

相关文章:

c++ - 模板类特化缺少成员

c - 带链表的快速排序

c - 删除传递给链表 C 中函数的单个节点

jQuery 发布对象

c++ - 循环链表算法

c++ - 在每个元音处添加字符

c++ - 你什么时候使用过 C++ 'mutable' 关键字?

c++ - 为什么堆栈跟踪会跳过一个显然必须调用才能到达以下函数的函数?

C++ 对象引用作为对象的成员变量

java - 将 MATLAB Javabuilder 输出对象元素转换为数组