我试图在C ++中实现通用的链接对象列表。但是当我两次获取同一个对象时,它会给我不同的结果。我觉得这是因为误用了指针。请帮我调试。
这是Node实现。我使用了指针模板,因为链表应包含用户定义的对象。
template <class T> class Node{
private:
T* value;
Node<T>* next;
public:
Node(T* v){value = v; next = NULL;}
Node(T* v, Node<T>* n){value = v; next = n;}
T* getElement(){return value;}
Node<T>* getNext(){return next;}
};
以下是通用链表的实现。
template <class T> class LinkedList{
public:
Node<T>* head = NULL;
LinkedList(){}
LinkedList(T* value){
Node<T> node(value);
head = &node;
}
Node<T>* getHead(){
return head;
}
void add(T* value){
Node<T> node(value,head);
head = &node;
}
};
主要功能: 当我打电话给链表的头部时,它给了我2个不同的答案。在这段代码中,Complex是一个容纳复杂对象的简单类。
int main(){
Complex c1(1,2); Complex c2(3,4); Complex c3(5,6);
LinkedList<Complex> list(&c1);
list.add(&c2);
cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl;
cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl;
return 0;
}
提前致谢!!
答案 0 :(得分:2)
在LinkedList(T* value)
和void add(T* value)
中,您使用head = &node;
获取临时地址。一旦你超出了该函数的范围,head
就成了悬空指针。
您需要在堆上创建一个新节点,以使其生命周期超出该函数的范围。
Node<T> node = new Node<T>(value);
不要忘记delete
在析构函数中创建的所有节点以避免内存泄漏,甚至更好,切换到智能指针而不是原始指针,以便为您完成清理。 / p>