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