Einfach verkettete Liste -> wieso struct?
-
Hi,
wir beschäftigen uns gerade mit Datenstrukturen und sind vor einiger Zeit an der verketteten Liste vorbeimarschiert.
Beim Nacharbeiten bin ich nun aber auf eine Frage gestoßen die sich mir noch nicht ganz erklärt hat:struct ListenElement { // Anwendungsdaten = Zeiger auf eine Klasse Daten Daten * data; // Zeiger auf das nächste ListenElement ListenElement * next; };
Mit solchen Konstrukten habe ich auch im Netz verkettete Listen gefunden.
Wobei die Struktur des ListenElements in einer Klasse Liste immer wieder neu erzeugt wird.
Wieso wird das immer mit einem Struct gelöst?
Kann ich nicht auch einfach eine Klasse "Liste" schreiben deren "head" auf ein Objekt dass die Daten enthält zeigt? Und in diesem Objekt verwalte ich dann einfach einen Pointer auf das nächste Element?
Spricht hier etwas dagegen, für den struct oder ist das einfach nur alte Kunst mit einem struct zu arbeiten?
-
Stefan_B schrieb:
Kann ich nicht auch einfach eine Klasse "Liste" schreiben deren "head" auf ein Objekt dass die Daten enthält zeigt? Und in diesem Objekt verwalte ich dann einfach einen Pointer auf das nächste Element?
Spricht hier etwas dagegen, für den struct oder ist das einfach nur alte Kunst mit einem struct zu arbeiten?
Es spricht einiges für das struct, und vieles gegen deine Überlegung. Hier nur 2:
1. Eine Klasse sollte nur die Elemente enthalten, die sie ausmacht. Ein Zeiger auf ein weiteres Element ist aber eine Implementationsspezifische Anforderung.
2. Man müsste jede Klasse, die für eine Liste verwendet werden soll, um eine Eigenschaft erweitert werden.
-
Okay, das leuchtet mir ein auch im Hinsicht was Wartbarkeit und Objektorientierung angeht..
Mit dem Struct ist es mir auch viel leichter gefallen, das hat jetzt recht flott geklappt eine Liste aufzubauen und innerhalb weniger Handgriffe so erweitert dass er sogar sortiert einfügen kann.
Dann sind wohl bald die Bäume fällig
-
Eine struct ist doch streng genommen auch eine Klasse - eine öffentliche!
-
Naja, eine Klasse ist das nicht so wirklich..
Eher ein Datentyp der wie ein Objekt behandelt werden kann und ich kannte sie nur als uralten C-Zeiten..
-
Stefan_B schrieb:
Naja, eine Klasse ist das nicht so wirklich..
Doch, absolut. Der einzige Unterschied zwischen
struct
undclass
ist die Default-Sichtbarkeit der Member (public
im Gegensatz zuprivate
).
-
Nexus schrieb:
Der einzige Unterschied zwischen
struct
undclass
ist die Default-Sichtbarkeit der Member (public
im Gegensatz zuprivate
).Und das selbe bei Vererbung ohne explizite Angabe des Sichtbarkeittypes.
-
Wieder was gelernt:)
-
Ich würde eine Klasse Liste<T> machen und innerhalb der Klasse würde ich für ein Listenelement eine struct erstellen:
struct Item { T data; Item *next; };
Da es sich bei den Items ja dann im wesentlichen nur um simple Membervariablen handelt, gibt es keine Notwendigkeit, das ebenfalls in einer Klasse (mit Gettern und Settern und "private" etc.) zu lösen.
Faustregel (auch wenn struct und class in C++ technisch fast das gleiche ist): Willst du ein richtiges Objekt haben mit Funktionalität etc., dann nimm eine Klasse. Willst du nur ein paar simple Variablen zusammenpacken, nimm ein struct. Denn du würdest ja auch eine int-Variable nicht nochmal in eine Integer-Klasse wrappen, wieso also Daten mit einem Next-Zeiger in eine richtige Klasse packen, so es doch nur eine Ansammlung von Variablen ist?
-
Die ListNode Klasse meiner doppelt verketteten Liste sieht recht ähnlich aus, denkt man sich den prev Zeiger weg, so ist sie identisch, abgesehen vom Konstruktor:
template <typename T> struct List<T>::ListNode { T value; ListNode* prev; ListNode* next; template <typename... ArgumentTypes> ListNode(ArgumentTypes&&... args) : value(std::forward<ArgumentTypes>(args)...) , prev(0) , next(0) {} };
-
Nexus schrieb:
Stefan_B schrieb:
Naja, eine Klasse ist das nicht so wirklich..
Doch, absolut. Der einzige Unterschied zwischen
struct
undclass
ist die Default-Sichtbarkeit der Member (public
im Gegensatz zuprivate
).@ Nexus: Da hätte ich noch eine Frage dazu. Ist zwar etwas OT aber würde
mich aber stark interessieren.
Kann ein struct auch einen Konstruktor oder Destruktor haben?
Wird dann dieser beim erstellen/löschen des Objekts auch automatisch aufgerufen ?Gruß Ulli
-
Kann ein struct auch einen Konstruktor oder Destruktor haben?
Ja. Genau wie bei einer Klasse.
Wird dann dieser beim erstellen/löschen des Objekts auch automatisch aufgerufen ?
Ja.
Edit:
Wie vermutlich schon mehrfach in diesem Thread genannt: Der einzige unterschied zwischen class und struct ist die default Sichtbarkeit (der Member und bei der Vererbung).