gpt4 book ai didi

C++模板化链表问题

转载 作者:行者123 更新时间:2023-11-30 00:38:51 26 4
gpt4 key购买 nike

我以前做过一些链表,这些概念对我来说都很有意义,但是对于一个项目,我必须用 C++ 做一个模板化的,我没有用过很多,我遇到了一些麻烦.请帮忙。我在这么简单的事情上花了太多时间。

我已经有了一些列表类,但问题就出在这里。当我在测试用例中制作三个节点并将它们全部链接起来时,如果我调用

node1.getNext().show();

这很好用,但是如果我

node1.getNext().getNext().show();

我遇到段错误(核心已转储)。这里有什么问题?我曾多次尝试更改 getNext() 和 getPrev() 返回值的指针,但没有成功。我觉得问这个问题很愚蠢,但我遇到了一些严重的麻烦。我的节点类在下面,后面是一个给出段错误的示例测试用例。

节点.h:

template <class T> class Node
{
public:
Node();
Node(T value);
void setPrev(Node<T> node);
void setValue(T value);
void setNext(Node<T> node);
Node<T> getPrev();
T getValue();
Node<T> getNext();
void show();
~Node() { }

private:
Node<T> *prev;
Node<T> *next;
T value;
};

//default construct
template <class T> Node<T>::Node() {
this->prev = NULL;
this->value = NULL;
this->next = NULL;
};

//overloaded construct
template <class T> Node<T>::Node(T value) {
this->prev = NULL;
this->value = value;
this->next = NULL;
}

template <class T> void Node<T>::setPrev(Node<T> node) {
this->prev = &node;
}

template <class T> void Node<T>::setValue(T value) {
this->value = value;
}

template <class T> void Node<T>::setNext(Node<T> node) {
this->next = &node;
}

template <class T> Node<T> Node<T>::getPrev() {
return this->prev;
}

template <class T> T Node<T>::getValue() {
return this->value;
}

template <class T> Node<T> Node<T>::getNext() {
return this->next;
}

template <class T>
void Node<T>::show() {
cout << value << endl;
}

测试用例:

int main(int argc, char **argv) {

typedef Node<int> IntNode;

IntNode head(NULL);
IntNode node1(23);
IntNode node2(45);
IntNode node3(77);
IntNode tail(NULL);
node1.setPrev(head);
node1.setNext(node2);
node2.setPrev(node1);
node2.setNext(node3);
node3.setPrev(node2);
node3.setNext(tail);

node1.show();
node2.show();
node3.show();

cout << node1.getNext().getValue() << endl;
cout << node1.getNext().getNext().getValue() << endl;
}

最佳答案

您需要通过引用而不是按值传递值。

当您的 node1.setNext(node1) 被执行时,setNext() 会在堆栈上获取 node1 的拷贝,而不是变量您在 main() 中定义。一旦 setNext() 退出,存储在 next 中的地址将不再有效。

对于初学者,将函数 setPrev 和 setNext 重新定义为

template <class T> void Node<T>::setPrev(Node<T> &node) {
this->prev = &node;
}

template <class T> void Node<T>::setNext(Node<T> &node) {
this->next = &node;
}

这将修复您的即时段错误。但是,您确实需要更多地考虑代码的设计以及按引用或按值传递时会发生什么,以正确编写代码并避免进一步的问题。

关于C++模板化链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com