EDIT - Beantwortete unten die verkleinerten Klammern. Danke allen.
Ich habe versucht, eine rudimentäre einfach verknüpfte Liste zu schreiben, die ich in anderen Programmen verwenden kann. Ich wünsche mir, dass es in der Lage ist, mit eingebauten und benutzerdefinierten Typen zu arbeiten, was bedeutet, dass es Vorlagen sein muss.
Aus diesem Grund muss mein Knoten auch templated sein, da ich die Informationen, die er speichern wird, nicht kenne. Ich habe eine Knotenklasse wie folgt geschrieben -
%Vor%Meine Klasse für verknüpfte Listen ist in einer separaten Klasse implementiert und muss einen Knoten instanziieren, wenn neue Knoten am Ende der Liste hinzugefügt werden. Ich habe das wie folgt umgesetzt -
%Vor%Ich habe einen Treiber / eine Testklasse wie folgt eingerichtet:
%Vor%Ich erhalte jedoch einen Fehler beim Kompilieren - Fehler C2955: 'Knoten': die Verwendung der Klassenvorlage erfordert eine Liste mit Vorlagenargumenten - was mich auf die folgende Codezeile meiner Add-Methode verweist -
%Vor%Ich verstehe nicht, warum das keine Informationen über den Typ enthält, da es an die verknüpfte Liste übergeben wurde, wenn es in meiner Treiberklasse erstellt wurde. Was soll ich tun, um die Typinformationen an Node weiterzugeben?
Soll ich eine private Knotenstruktur anstelle einer separaten Klasse erstellen und die Methoden beider Klassen in einer Datei kombinieren? Ich bin mir nicht sicher, ob das das Problem lösen würde, aber ich denke, es könnte. Ich würde jedoch lieber getrennte Klassen haben, wenn möglich.
Danke, Andrew.
Könnte es versuchen
%Vor%Um Hinweise zum Entwerfen der Liste zu erhalten, können Sie natürlich auch std :: list sehen, obwohl es manchmal etwas abschreckend sein kann.
Obwohl die Antworten bereits gegeben wurden, denke ich, werde ich mein Körnchen hinzufügen.
Beim Entwerfen der Vorlagenklasse ist es eine gute Idee, die Vorlagenargumente nicht überall zu wiederholen, nur für den Fall, dass Sie (ein Tag) ein bestimmtes Detail ändern möchten. Im Allgemeinen geschieht dies mit typedefs.
%Vor%Es ist auch besser, die Methoden außerhalb der Klassendeklaration zu definieren, um das Lesen der Schnittstelle zu erleichtern.
%Vor%Nun, ein paar Anmerkungen:
List<T>::add
einen Iterator an die neu hinzugefügten Objekte zurückgibt, wie insert
Methoden in der STL (und Sie könnten ihn auch umbenennen) List<T>::add
weisen Sie Speicher temp
zu und führen dann eine Reihe von Vorgängen aus, falls irgendwelche Würfe auftreten, haben Sie Speicher setNextNull
sollte nicht notwendig sein: Der Konstruktor von Node
sollte alle Datenelemente auf sinnvolle Werte initialisieren, einschließlich m_next
Also hier ist eine überarbeitete Version:
%Vor% Beachten Sie, dass die einfache Tatsache, einen richtigen Konstruktor zu verwenden, unsere Ausnahmesicherheit verbessert: Wenn überhaupt etwas während des Konstruktors geworfen wird, ist new
erforderlich, um keinen Speicher zuzuweisen, daher ist nichts geleakt und wir haben noch keine Operation ausgeführt. Unsere List<T>::insert
-Methode ist jetzt belastbar.
Letzte Frage:
Usual insert
Methoden der einzelnen verknüpften Listen einfügen am Anfang, weil es einfacher ist:
Sind Sie sicher, dass Sie am Ende mit einem Einsatz gehen wollen? Oder hast du es auf diese Weise gemacht, weil die Methode push_back
auf traditionellen Vektoren und Listen funktioniert?
Wie gesagt, die Lösung ist
%Vor% ... weil Node
selbst kein Typ ist, Node<T>
ist.
Und Sie müssen auch den Template-Parameter für den Node * temp in der Druckliste angeben.
Sie sollten auf diese Weise einen neuen Knoten hinzufügen
Node<T>* temp=new node<T>;
Ich hoffe, du hast es gelöst :)
Tags und Links c++ templates linked-list