我正在尝试使用所有 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 的内容时,您不会操纵节点的状态。
所以你应该对普通字段(prev
和 next
)进行操作,返回对访问器中字段的引用(如 shared_ptr>& getNext() { return next; }) 或为字段添加 setter 方法并使用它们。
关于尝试从双链表打印数据时 C++ 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36761370/