Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

08.04.2013, 18:46

Naja, überleg dir einfach mal wie lang deine Objekte leben. Dann wirst du feststellen, dass die Lebensdauer eines Objekts normalerweise nicht von der Lebensdauer mehr als eines anderen Objektes abhängt. Ein Objekt wird in der Regel lokal in einer Funktion oder als Member eines anderen Objektes erzeugt und stirbt beim Verlassen der Funktion oder mit seinem Parent Objekt auch wieder. Smartpointer sind kein Ersatz für Pointer, sondern ein völlig unabhängiges Konzept (Stichwort RAII). Ein Objekt wird möglicherweise von vielen anderen Objekten verwendet. An die übergibst du einfach Referenzen oder normale Zeiger. Aber die Lebensdauer eines Objektes hängt normalerweise nur mit einer anderen Stelle zusammen. Und genau dort verwendest du dann einen unique_ptr. shared_ptr ist für den seltenen Fall gedacht, dass die Lebensdauer eines Objektes tatsächlich von der Lebensdauer von mehr als einem anderen Objekt abhängt. Anwendungen wo sowas tatsächlich als prinzipielle Eigenschaft des zu lösenden Problems auftritt sind eher selten; meistens wird einfach aus Faulheit gleich mal mit shared_ptr herumgeworfen, weil man sich keine Gedanken über grundlegende Dinge wie Scope und Lifetime machen will. Das Ergebnis ist dann früher oder später ein hyperkompliziertes, praktisch nichtmehr durchschaubares, unbeherrschbares Gewirr aus Abhängigkeiten, das erfolgreich jegliche Flexibilität, die ansonsten vielleicht noch irgendwo vorhanden wäre, im Keim erstickt...

Getter-Methoden sind übrigens auch etwas für die Liste der Dinge die es zu vermeiden gilt... ;)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (08.04.2013, 18:57)


primat

Frischling

  • »primat« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Hamburg

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

08.04.2013, 20:26

Naja, überleg dir einfach mal wie lang deine Objekte leben. Dann wirst du feststellen, dass die Lebensdauer eines Objekts normalerweise nicht von der Lebensdauer mehr als eines anderen Objektes abhängt. Ein Objekt wird in der Regel lokal in einer Funktion oder als Member eines anderen Objektes erzeugt und stirbt beim Verlassen der Funktion oder mit seinem Parent Objekt auch wieder. Smartpointer sind kein Ersatz für Pointer, sondern ein völlig unabhängiges Konzept (Stichwort RAII). Ein Objekt wird möglicherweise von vielen anderen Objekten verwendet. An die übergibst du einfach Referenzen oder normale Zeiger. Aber die Lebensdauer eines Objektes hängt normalerweise nur mit einer anderen Stelle zusammen. Und genau dort verwendest du dann einen unique_ptr. shared_ptr ist für den seltenen Fall gedacht, dass die Lebensdauer eines Objektes tatsächlich von der Lebensdauer von mehr als einem anderen Objekt abhängt. Anwendungen wo sowas tatsächlich als prinzipielle Eigenschaft des zu lösenden Problems auftritt sind eher selten; meistens wird einfach aus Faulheit gleich mal mit shared_ptr herumgeworfen, weil man sich keine Gedanken über grundlegende Dinge wie Scope und Lifetime machen will. Das Ergebnis ist dann früher oder später ein hyperkompliziertes, praktisch nichtmehr durchschaubares, unbeherrschbares Gewirr aus Abhängigkeiten, das erfolgreich jegliche Flexibilität, die ansonsten vielleicht noch irgendwo vorhanden wäre, im Keim erstickt...

Danke! Ich denk, ich habs nun verstanden.


Getter-Methoden sind übrigens auch etwas für die Liste der Dinge die es zu vermeiden gilt... ;)


Warum? Klar, wenn ich für ein Attribut schlichte Getter und Setter schreibe, könnte ich es gleich public machen. Aber wenn ich zum Beispiel möchte, dass ein Attribut von außen gelesen, aber nicht geschrieben werden kann? Was spricht dann gegen Getter? Oder gibts da bei C++ noch eine Möglichkeit, von der ich noch nichts weiß?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

08.04.2013, 20:30


Getter-Methoden sind übrigens auch etwas für die Liste der Dinge die es zu vermeiden gilt... ;)


Warum? Klar, wenn ich für ein Attribut schlichte Getter und Setter schreibe, könnte ich es gleich public machen. Aber wenn ich zum Beispiel möchte, dass ein Attribut von außen gelesen, aber nicht geschrieben werden kann? Was spricht dann gegen Getter? Oder gibts da bei C++ noch eine Möglichkeit, von der ich noch nichts weiß?

Ich sag nicht, dass Getter rein prinzipiell immer schlecht sind; insbesondere wenn es nur einen Getter oder nur einen Setter gibt, ist das manchmal schon OK so, aber allerspätestens wenn es für ein Attribut Getter und Setter gibt, sollten die Alarmglocken läuten. Wann immer du von außen auf ein Attribut einer Klasse zugreifen willst, solltest du dir auf jeden Fall erst einmal die Frage stellen, warum das Ding eigentlich in der Klasse steckt. Bei dem von dir erwähnten Getter für einen Pointer auf ein Unterobjekt wär ich jedenfalls mal sehr sehr vorsichtig...

Disclaimer: "Getter" und "Setter" sind leider etwas schwammige Begriffe, ich mein damit vor allem Methoden, die nichts anderes tun, als eine direkte Verbindung zwischen Datenmembern und der Außenwelt herzustellen. Auch sollte man erwähnen, dass OOP nur ein Programmierstil von vielen ist und man in C++ in der Regel auf verschiedenen Ebenen verschiedenen Programmierstilen folgt. Es hat imo z.B. keinen Sinn, einen Typ, dessen Instanzen Farbwerte repräsentieren, nach OOP Prinzipien zu entwerfen...

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (08.04.2013, 20:43)


Werbeanzeige