Einfach verkettete Liste -> wieso struct?
-
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).