2009-05-07 3 views
2

Ich habe eine verknüpfte List-Klasse und aus irgendeinem Grund, wenn ich ein int in einem Objekt erhöhen. Z. B. linked1.size aus irgendeinem Grund linked2.size erhöht auch!C++ versehentlich statische verknüpfte Liste

Und Ideen, warum das ist? Ich habe es nicht absichtlich zu einer statischen Variable gemacht.

mein Code:

main() 
{  
Vlist v1; 
v1.add(1,0); 
v1.add(2,0); 

Vlist v2; 
} 

die Größe Membervariable Inkrementieren tritt in der add() Funktion wie folgt aus:

(*this).size++; 

Das Ergebnis sollte die v1.size == 2 und v2.size = sein = 0, aber stattdessen v2.size == 2!

Dieses Problem hat mich stundenlang verrückt gemacht - jede Hilfe würde wirklich geschätzt werden!

Die Zusatzfunktion ist wie folgt:

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());} 
}; 
+3

Welches Problem? Sie demonstrieren ein Problem mit zwei Listen, indem Sie Code mit nur einem Code anzeigen? Wie können wir helfen? Veröffentlichen Sie den Code, der das Problem aufweist, und posten Sie, was Sie erhalten haben, und geben Sie anstelle einer allgemeinen Problembeschreibung die erwarteten Ergebnisse ein. –

+0

Können Sie die vollständige Definition Ihrer Klasse veröffentlichen? – PaulJWilliams

+1

Nicht verwandt mit Ihrer Frage, aber statt (* this) .size verwenden Sie diese-> Größe –

Antwort

1

Ohne mehr Code zu sehen, ich kann nicht sicher sein, aber ist es möglich, v1 und v2 sind eigentlich Referenzen auf das gleiche Objekt verknüpfte Liste?

+0

Sie scheinen nicht die gleiche Struktur zu haben, weil v2 leer bleibt, außer für die Größe, die inkrementiert wird. – Meir

2

Könnte es sein, dass linked1 und linked2 irgendwie auf die gleiche Struktur verweisen? Sie können

printf("adress1 %p", &linked1) 
printf("adress2 %p", &linked2) 
printf("adress1/size %p", &linked1.size) 
printf("adress2/size %p", &linked2.size) 

Für andere Mitglieder der Vlist versuchen repectively

Edit (& linked1.data?): Nun, da der vollständige Code sichtbar ist (und da add_quiet (...) und füge (...) mach das gleiche Prinzip) Ich glaube nicht, dass ein "geteiltes" Größenklassenfeld das Problem ist. Verwenden Sie einen Debugger und verfolgen Sie die Adressen Ihrer Listen. Das ist ziemlich seltsam, aber ich bin jetzt mehr als je zuvor an der Lösung interessiert.

0

Es scheint, als ob der Debugger mir die Werte für V2 erklärt hat, sogar bevor es aus irgendeinem Grund deklariert wurde. (Ich benutze Codeblocks).
Am Ende habe ich mich entschieden, diese Variablen am Anfang der Seite zu deklarieren und dieses spezielle Problem ist behoben.
Ich hatte gehofft, einen Designfehler zu entdecken, der ein paar andere Probleme erklären würde, die schwer zu beschreiben sind, ohne mein gesamtes Projekt auf diese Website zu laden. Kein solches Glück.
Wie für den Rest meines Programms ... Seufzer.

Wie auch immer, vielen Dank für Ihre Hilfe.

+0

Welchen Compiler haben Sie für Code :: Blocks verwendet? Ich denke, g ++ war deine Entscheidung? – msi