所有!我不知道“覆盖”是否是正确的词。在我的
编程类中,我必须创建一个循环列表,以便每个节点
节点包含指向下一个节点和最后一个节点的指针
指向第一个节点。此外,还有一个尾节点指向
最后添加的节点(添加任何节点之前为null)。

我无法填充列表(称为响铃),因为每次调用
Ring :: Insert(const int&d)函数,它插入一个节点,并且
到达新的RingNode对象“ RingNode newNode(d);”行
覆盖我上次创建的先前的RingNode对象
称为Ring :: Insert(const int&d)函数。显然,我不要
这是因为它弄乱了我的名单。我如何做到每次
函数创建一个全新的RingNode对象,该对象不会干扰
以前的RingNode对象?

我的头文件中的源代码,以防万一:

class RingNode {
public:
    RingNode(const int& i=0 ): data(i), next(NULL){}
private:
    int data;  /* ID of player */
    RingNode* next;
friend class Ring;


这是有问题的功能

RingNode* Ring::Insert(const int& d){
    RingNode newNode(d); //This line overwrites previous RingNode objects
    RingNode* refNode = &newNode; //Probably bad form, but that's not my main concern right now
    if (tail==null){
            tail = refNode;
            newNode.next = refNode;
            return refNode;
    }
    newNode.next = (*GetTail()).next;
    (*GetTail()).next = refNode;
    tail = refNode;
    return refNode;
}


因此,例如,如果我在主目录中执行以下代码段...

Ring theRing;
theRing.Insert(5);
theRing.Insert(2);
theRing.Insert(7);


如果我调试项目,我会看到TheRing仅包含一个RingNode,
首先是5个RingNode,然后2个RingNode覆盖它,然后是7个
RingNode会覆盖它。感谢您的阅读,并再次感谢您
回覆!

编辑:我替换了

RingNode newNode(d);
RingNode* refNode = &newNode;




RingNode *newNode = new RingNode(d);


调整了其余的代码,它工作正常。伙计们,非常感谢您的帮助!非常有用的信息,最重要的是,我现在明白了为什么它搞砸了。

最佳答案

您每次都在堆栈上重复使用相同的局部变量。

RingNode newNode(d); //This line overwrites previous RingNode objects


是局部变量-它存在于堆栈中。因此,它仅在插入方法的生命周期内有效。但是,由于您要从同一个调用函数连续多次插入insert,因此不同的“ newNode”最终会出现在堆栈中的同一位置。

您可能想做的是

RingNode *refNode = new RingNode(d);


这将在堆上动态分配您的RingNode。

但是,现在,您必须担心在环被销毁时使用delete清理所有节点。

10-08 00:41