我正在尝试用C ++实现自己的Stack,但是当我尝试使用pop()方法时,却一直收到此错误:
如果您能帮助我,我将不胜感激。谢谢!
节点类:
template<class T>
class Node {
private:
Node<T>* next;
T element;
public:
Node();
Node(const Node& orig);
~Node();
void setElement(T el);
T getElement();
Node<T>* getNext();
void setNext(Node<T>* ne);
};
堆栈类:
#include "EmptyStackException.cpp"
#include "Node.cpp"
#include <iostream>
using namespace std;
template<class T>
class LinkedStack {
private:
int siz;
Node<T>* first;
public:
LinkedStack();
~LinkedStack();
int size();
bool isEmpty();
void push(T e);
T top();
T pop();
};
template<class T>
void LinkedStack<T>::push(T e) {
Node<T> node = Node<T>();
node.setNext(first);
node.setElement(e);
first = &node;
siz++;
}
template<class T>
T LinkedStack<T>::pop() {
T res = first->getElement();
first = *(first->getNext());
siz--;
}
答案 0 :(得分:1)
template<class T>
void LinkedStack<T>::push(T e) {
Node<T> node = Node<T>();
node.setNext(first);
node.setElement(e);
first = &node;
siz++;
}
由于node
是此函数的本地对象,因此一旦函数结束,它就会被销毁。但是,first
包含一个指向它的指针。因此,当此函数返回时,first
包含一个指向不再存在的对象的指针。您可能想要这样:
template<class T>
void LinkedStack<T>::push(T e) {
Node<T>* node = new Node<T>();
node->setNext(first);
node->setElement(e);
first = node;
siz++;
}
现在,当该函数返回时,node
仍然不存在。但是first
不包含指向node
的指针,它包含node
的值-指向动态分配对象的指针。
请注意,您将必须以某种方式管理该对象的生存期。理想情况下,您将不使用原始指针,以免造成负担。