C ++ Vorlagen - LinkedList

8

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.

    
Drew_StackID 16.01.2010, 23:14
quelle

9 Antworten

8

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.

    
villintehaspam 16.01.2010, 23:18
quelle
12

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:

  • es wäre benutzerfreundlicher, wenn 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)
  • in der Implementierung von 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
  • durchgesickert
  • Der Aufruf 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:

%Vor%

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?

    
Matthieu M. 17.01.2010 13:58
quelle
1

Diese Zeile sollte

lesen %Vor%

Gleiches gilt für den Zeiger next in der Node-Klasse.

    
sepp2k 16.01.2010 23:19
quelle
1

Wie gesagt, die Lösung ist

%Vor%

... weil Node selbst kein Typ ist, Node<T> ist.

    
Kornel Kisielewicz 16.01.2010 23:20
quelle
0

Sie brauchen:

%Vor%

Könnte ein typedef NodeType = Node<T> in der Klasse CustomLinkedList wert sein, um zu verhindern, dass dieses Problem wieder auftritt.

    
P-Nuts 16.01.2010 23:24
quelle
0

Und Sie müssen auch den Template-Parameter für den Node * temp in der Druckliste angeben.

    
UnknownGuy 16.01.2010 23:36
quelle
0
%Vor%     
thecharliex 02.01.2014 21:05
quelle
0

Sie sollten auf diese Weise einen neuen Knoten hinzufügen

  

Node<T>* temp=new node<T>;

Ich hoffe, du hast es gelöst :)

    
Waseem Ahmad Naeem 29.11.2015 07:40
quelle
0
%Vor%     
Narendra kumawat 25.04.2017 09:48
quelle

Tags und Links