c++意外静态链表
Posted
技术标签:
【中文标题】c++意外静态链表【英文标题】:c++ accidentally static linked list 【发布时间】:2009-05-07 11:31:07 【问题描述】:我有一个链表类,由于某种原因,当我将一个 int 递增到一个 对象,例如linked1.size,由于某种原因,linked2.size 也会增加!
以及为什么会这样?我不是故意让它成为一个静态变量。
我的代码:
main()
Vlist v1;
v1.add(1,0);
v1.add(2,0);
Vlist v2;
增加 size 成员变量发生在 add()
函数中,如下所示:
(*this).size++;
结果应该是 v1.size==2 和 v2.size==0,而不是 v2.size==2!
这个问题已经让我发疯了好几个小时 - 任何帮助都将不胜感激!
添加函数如下:
int Vlist::quietAdd(Vertex new_vertex, int i_loc)
Vnode* temp= first_node;
Vnode* newNode= NULL;
//check for unique
if (find(new_vertex)!=999)
return 0;
//check for non-negative i value
if (i_loc<0)
cout<<"Invalid index."<<endl;
return 0;
//and exit here?
else
temp = find(i_loc);
newNode= new Vnode();
if (size==0)
first_node= newNode;
//assigning to the new vnode the new Vertex value
(*newNode).updateVertex(new_vertex.getInt());
//the nxt pointer now points to the value it's replacing or NULL
(*newNode).updateNextPoint(temp);
if ((temp==NULL)&&size!=0)
//size-1 is used to get the pointer to the last value on the list
(*newNode).updatePrevPoint(find(size-1));
(*find((size-1))).updateNextPoint(newNode);
if (temp !=NULL)
//the new vnode's prev pointer now points to correct location
(*newNode).updatePrevPoint((*temp).getPrevPoint());
if ((*temp).getPrevPoint()!=NULL)
/*the vnode that used to point to the existing vnode now
points to new vnode*/
(*((*temp).getPrevPoint())).updateNextPoint(newNode);
//the old one's prev pointer points back to the new value
(*temp).updatePrevPoint(newNode);
/*if we've just put a new vnode at the start then it should be
pointed to by the "first vnode" pointer*/
if (i_loc==0)
first_node=newNode;
(*this).size++;
return 1;
//Vlist class definition
class Vlist
private:
int size;
Vnode* first_node;
public:
//copy constructor
Vlist(const Vlist& vl2):size(vl2.size), first_node(NULL)
for (int i=0;i<size;i++)
quietAdd(vl2.read(i),i);
Vertex getNext();
Vlist (): size(0) first_node=0;
~Vlist ();//make deep!
bool empty();
Vnode* find(int i_loc) const;
int find(Vertex target)const;
void add(Vertex new_vertex, int i_loc);
int quietAdd(Vertex new_vertex, int i_loc);
Vertex remove(int i_loc);
Vertex read(int i_loc) const;
Vnode* getFirstNode() return first_node;
int getSize() const return size;
void setSize(int newSize) size = newSize;
char* print() const;
void delete_List();
;
class Vnode
private:
Vertex vertex;
Vnode* prev_node;
Vnode* nxt_node;
public:
Vnode ()
: prev_node(0), nxt_node(0)
vertex.update(0);
~Vnode (); //destructor
Vertex getVertex()return vertex;
int getVertexInt() return vertex.getInt();
Vertex getNext()return (*nxt_node).getVertex();
Vnode* getNextPoint() return nxt_node;
Vnode* getPrevPoint() return prev_node;
void updateNextPoint(Vnode* newP) nxt_node = newP;
void updatePrevPoint(Vnode* newP) prev_node= newP;
void updateVertex(Vertex vertexVal) vertex.update(vertexVal.getInt());
;
【问题讨论】:
哪个问题?您通过显示仅使用一个列表的代码来证明两个列表存在问题?我们能帮你什么吗?发布显示问题的代码,发布你得到的,发布你期望的,而不是概述问题描述。 你能发布你的类的完整定义吗? 与您的问题无关,但是使用 this->size 代替 (*this).size 不要使用TAB字符!!!请!!! 能否提供 Vlist::add() 函数定义?代码还准确显示了您如何比较尺寸。您没有向我们展示的比较代码可能存在一些逻辑错误。我猜你有'if (v1.getSize() == v2.getSize) cout 【参考方案1】:可能linked1
和linked2
以某种方式指向同一个结构?
你可以试试
printf("adress1 %p", &linked1)
printf("adress2 %p", &linked2)
printf("adress1/size %p", &linked1.size)
printf("adress2/size %p", &linked2.size)
分别送给Vlist
的其他成员(&linked1.data?)
编辑:现在完整的代码是可见的(并且鉴于 add_quiet(...) 和 add(...) 原则上做同样的事情)我不认为“共享”大小类字段是问题。请使用调试器并跟踪列表的地址。这很奇怪,但我现在比以往任何时候都对解决方案更感兴趣
【讨论】:
【参考方案2】:没有看到更多代码,我不能确定,但是否有可能 v1 和 v2 实际上是对同一个链表对象的引用?
【讨论】:
它们似乎不是同一个结构,因为 v2 仍然是空的,除了大小正在增加。【参考方案3】:调试器似乎在告诉我 v2 的值是什么,甚至在它出于某种原因被声明之前。 (我正在使用代码块)。 最后,我只是决定在页面顶部声明这些变量,这个特殊问题得到了解决。 我希望能发现一些设计缺陷来解释一些其他问题,如果不将我的整个项目上传到这个网站上,这些问题很难描述。没有这样的运气。 至于我的程序的其余部分...sigh。
无论如何,感谢您的帮助。
【讨论】:
你在 Code::Blocks 底层使用了什么编译器?我猜,g++ 是你的选择?以上是关于c++意外静态链表的主要内容,如果未能解决你的问题,请参考以下文章