我正在根据第一原则在C++中实现一个无序列表。我的(到目前为止部分完成(实现是:
#include <iostream>
class Node {
int m_data;
Node *m_next;
public:
Node(int data)
{
m_data = data;
m_next = nullptr;
}
int getData() { return m_data; }
void setData(int data) { m_data = data; }
Node* getNext() { return m_next; }
void setNext(Node *next) { m_next = next; }
};
class UnorderedList {
public:
Node *m_head;
public:
UnorderedList()
{
m_head = nullptr;
}
bool isEmpty() { return m_head == nullptr; }
void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}
void remove(int data);
bool search(int data);
};
int main()
{
UnorderedList list1;
list1.appendToHead(32);
list1.appendToHead(47);
list1.appendToHead(90);
std::cout << list1.m_head->getData() << 'n';
std::cout << list1.m_head->getNext()->getData() << 'n';
return 0;
}
我能够正确地将列表的头部打印为"90",但下一行(即getNext((->getData(((被打印为一个大的随机数(281314120(。这是什么原因呢?
void appendToHead(int data)
{
Node temp = Node(data);
temp.setNext(m_head);
m_head = &temp;
}
切勿存储具有自动存储持续时间的对象地址。当该方法完成时appendToHead
该对象(在本例中为 temp
(将不复存在。
您这样做并调用了未定义的行为。您可能想执行以下操作:
void appendToHead(int data)
{
Node* temp = new Node(data);
temp->setNext(m_head);
m_head = temp;
}
您还应该考虑满足五法则
除了原始指针之外,还探索std::unique_ptr
的使用。