为什么解除引用节点会破坏我的链表?

时间:2013-05-09 15:51:56

标签: c++ pointers

所以我试图在C ++中实现一系列轧机链表

template<class T>
class Node
{
private:
    Node *next;
    T item;

public:
    Node(T item)
        : item(item)
    {
        this->next = NULL;
    }

    Node<T> add(T item) {
         this->next = new Node(item);
         return *this->next;
    }

    bool hasNext()
    {
        return this->next == NULL;
    }

    Node<T> getNext()
    {
        return *this->next;
    }

    T value()
    {
        return this->item;
    }
};

void main()
{
    Node<int> node(3);
    node.add(3).add(4);

    cout << node.value();
    cout << node.getNext().value();
    cout << node.getNext().getNext().value();

    cin.get();
}

但是我无法让它发挥作用。特别是本节:

    node.add(3).add(4);

    cout << node.value();
    cout << node.getNext().value();
    cout << node.getNext().getNext().value();

如果我将addgetNext函数更改为Node<T>*而不是Node<T>,则可以正常工作。但为什么解除引用会导致代码中断?我认为.符号比->更有意义,但我无法使其工作。我做错了什么?

1 个答案:

答案 0 :(得分:7)

现在您正在复制您添加的节点,而不是返回您创建的实际节点。括号只是为稍后需要查看代码的其他人添加了一些清晰度。 add函数需要像这样改变:

Node<T>& add(T item) {
     this->next = new Node(item);
     return *(this->next);
}

或者您可以返回指向新创建的节点的指针,但是这会使用.而不是主->中断。

还需要对next()

进行类似的更改