2016-07-05 6 views
-1

Ich habe versucht, generische verkettete Liste von Objekten in C++ zu implementieren. Aber wenn ich das gleiche Objekt zweimal hole, gibt es mir andere Ergebnisse. Ich denke, es ist auf den Missbrauch von Zeigern zurückzuführen. Bitte hilf mir beim Debuggen.generische verkettete C++ - Implementierung in c

Hier ist die Knoten-Implementierung. Ich habe Zeiger für Vorlagen verwendet, da die verknüpfte Liste benutzerdefinierte Objekte enthalten soll.

Hier ist die Implementierung für generische verkettete Liste.

template <class T> class LinkedList{ 
public: 
Node<T>* head = NULL; 
LinkedList(){}  
LinkedList(T* value){ 
    Node<T> node(value); 
    head = &node; 
} 
Node<T>* getHead(){ 
    return head; 
} 
void add(T* value){ 
    Node<T> node(value,head); 
    head = &node; 
} 
}; 

Hauptfunktion: Als ich Leiter der verknüpften Liste nennen, es gibt mir 2 verschiedene Antworten. In diesem Code ist Complex eine einfache Klasse für komplexe Objekte.

int main(){ 
    Complex c1(1,2); Complex c2(3,4); Complex c3(5,6); 
    LinkedList<Complex> list(&c1); 
    list.add(&c2); 
    cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl; 
    cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl; 
    return 0; 
    } 

Vielen Dank im Voraus!

+0

'C' hat keine Klassen, Sie können also keine Klasse in' C' mit 'Klassen' implementieren. Versuchen Sie, eine Struktur zu verwenden. –

+1

Verwenden Sie Ihren Debugger. SO ist kein Debugging-Service. Nachdem Sie das Problem verfolgt haben, können Sie eine Frage stellen, wenn Sie nicht verstehen, warum der Code so ausgeführt wird, wie er ist, aber an diesem Punkt haben Sie alle Details darüber, was passiert, um Ihre Frage zu stellen. –

+0

Warum nicht einfach 'std :: list' verwenden und fertig sein? –

Antwort

2

In LinkedList(T* value) und void add(T* value) nehmen Sie die Adresse eines temporären mit head = &node;. Sobald Sie außerhalb des Bereichs dieser Funktion sind, wird head zu einem ungeeigneten Zeiger.

Sie müssen einen neuen Knoten auf dem Heap erstellen, damit dessen Lebensdauer über den Bereich dieser Funktion hinausgeht.

Node<T> node = new Node<T>(value); 

Vergessen Sie nicht zu delete alle Knoten, die Sie in der destructor erstellten Speicherlecks, oder noch besser zu vermeiden, schalten Sie auf intelligente Zeiger anstelle von rohen Zeiger so die Bereinigung für Sie getan wird.

+0

Upvoted, aber empfehlen, "auf dem Heap" für "in dynamischen Speicher" auszutauschen. Auf diese Weise haben Sie die seltenen Fälle, in denen dynamischer Speicher nicht mit einem Heap abgedeckt wird. – user4581301