Zugriff auf privaten Klassenzeiger per getter
-
Hallo liebes Forum,
ich programmiere nur so zum Spaß und bin daher noch recht unerfahren, arbeite aber regelmäßig diverse Tutorials und Bücher durch, um in C++ besser zu werden und mehr zu verstehen. Allerdings scheine ich eine Sache in Bezug auf Klassen, Zeiger und dynamische Speicherverwaltung noch nicht ganz verstanden zu haben.
Ich hab folgende Klasse:
class MAZ { public: //Konstruktoren MAZ (); MAZ (MAZ* before, Typ medium, String name, ...); MAZ (const MAZ &obj); //Kopierkonstruktor //Destruktor ~MAZ(); //getter MAZ* getBefore(); MAZ* getNext(); [...] private: //Eigenschaften MAZ* before; MAZ* next; int id; [...] };
Jetzt möchte ich mehrere Objekte der Klasse zur Laufzeit erzeugen und diese mit in einer verketteten Liste zusammenhalten.
Das hier würde funktionieren, wenn der next-Zeiger public wäre:
MAZ* actual = MAZ::getStart(); actual->next = new MAZ (actual, MAZ::V, ...);
Jetzt ist "next" aber private und sollte es auch sein (wobei ich auch schon Forenbeiträge gefunden habe, die sagen, dass setter/getter blödsinn sind...)
Aber warum funktioniert das dann hier nicht?
actual->getNext() = new MAZ (actual, MAZ::V, ...);
Da kriegt ich vom Compiler die Fehlermeldung "Ausdruck ist nicht zuweisbar."
Aber gebe ich mit getNext nicht eigentlich einen Zeiger zurück und hätte das gleiche als wenn ich direkt auf next zugreifen würde?Hier die getNext-Funktion:
MAZ* MAZ::getNext() { return this->next; }
Liebe Grüße
Der Hobbyprogrammierer
-
getNext liefert eine Adresse.
MAZ*& MAZ::getNext() { return next; }
würde deiner Vorstellung entsprechen. Warum machst du next aber dann nicht gleich public?
Besser: halte in MAZ nur die Daten und verwende std::list<MAZ>.
-
ah, tatsächlich das macht Sinn. Wär ich nicht drauf gekommen den Zeiger als Referenz zurückzugeben, hätte gedacht, der gibt nicht nur ne Adresse zurück, sondern den Zeiger als Kopie. Aber gut, als Referenz ist das schon sinniger.
Klar, public könnte ich es theoretisch machen, aber in den meisten Büchern wird immer gesagt, dass man Klasseneigenschaften immer private halten sollte und deswegen will ich das mal so probieren und gucken, wie ich den Zugriff darauf kriege.
std::list muss ich mir nochmal genauer angucken, sieht für mich auf den ersten Blick so aus, als macht das im Prinzip das gleiche, was ich manuell gemacht habe. Möchte aber erstmal etwas mehr Übung/Verständnis beim Selbst-Konstruieren von verketteten Listen kriegen, bevor ich auf die Vorlagen zurückgreife, oder meinst du das macht keinen Sinn?
Vielen Dank auf jeden Fall für deine Hilfe!!
-
Der Hobbyprogrammierer schrieb:
Klar, public könnte ich es theoretisch machen, aber in den meisten Büchern wird immer gesagt, dass man Klasseneigenschaften immer private halten sollte und deswegen will ich das mal so probieren und gucken, wie ich den Zugriff darauf kriege.
In diesen Büchern werden aber sicher getter und setter verwendet.
Möchte aber erstmal etwas mehr Übung/Verständnis beim Selbst-Konstruieren von verketteten Listen kriegen, bevor ich auf die Vorlagen zurückgreife, oder meinst du das macht keinen Sinn?
Dein Ansatz ist eher schlechtes C in Klassen verkleidet. Ich denke nicht, dass du so etwas sinnvolles lernst.