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

1

08.12.2014, 19:19

Konstruktor vs. Init-Methode

Hallo zusammen,

ich komme eigentlich aus der Java-Ecke - und etwas C#.
Nebenher versuche ich mir zur Zeit C++ anzueigenen. Dazu verwende ich das von Herrn Kalista geschriebene Buch.
Eine Sache, die mir in mehreren Quellcode-Beispielen aufgefallen ist, ist die Verwendung einer Init-Methode, um (hauptsächlich) die Membervariablen zu initialisieren.
Ich persönlich kenne das aus meiner Erfahrung eher so, dass man dieses direkt im Konstruktor macht.
Daher meine Frage:
Gibt es einen großen Unterschied, den ich übersehe und dieses Vorgehen notwendig macht,
ergeben sich durch das Vorgehen Vorteile (oder ggf. Nachteile),
ist das in der C++-Welt einfach üblicher
oder ist es einfach nur Geschmacksache?

Vielen Dank im Voraus

2

08.12.2014, 19:33

Allgemein sollte man Konstruktoren verwenden, dazu sind die Dinger ja auch da. Die init methode kann man leicht vergessen aufzurufen oder gar mehrfach aufrufen.

3

08.12.2014, 19:40

Die init methode kann man leicht vergessen aufzurufen oder gar mehrfach aufrufen.
Genau aus diesem Grund kam mir diese Methode eben auch seltsam vor; weshalb ich im Umkehrschluss annahm, dass man das nur auf Grund einer bestimmten Notwendigkeit macht.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

08.12.2014, 19:45

Generell ist auch in C++ die Empfehlung das im Konstruktor zu machen. Siehe auch RAII Idiom.
Was passiert wenn man nicht die "Init"-Methode aufruft? In welchen Zustand befindet sich das Objekt zwischen der Konstruktion und dem Aufruf der "Init"-Methode? Was passiert, wenn die "Init"-Methode fehlschlägt(Exception)? Überhaupt ist die Methode sinnloser Zusatzcode.

In C++ gibt es zusätzlich auch noch im Konstruktor die Initializer Liste, die es so in Java/C# nicht gibt. Da bietet sich das noch ganz besonders an.
Also bleib ruhig bei dem Vorgehen, dass du dir bisher angeeignet hattest.
Das Buch von Heiko Kalista ist einfach nicht der heilge Gral für C++ sondern ein nicht mehr neues Anfängerbuch. ;)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

08.12.2014, 21:17

Was kann man den nicht über den Konstruktor lösen?
Ein Konstruktor ist auch nur eine Methode. Da kann man genauso alles machen. Auch beliebige und komplexe Framework-Methoden aufrufen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

08.12.2014, 21:21

Nun, es gibt definitiv Fälle, wo man nicht alle notwendigen Objekte im Konstruktor von Objekt X übergeben kann. Z.B. dann, wenn ein Objekt Y eine Referenz auf X benötigt. Das geht aber natürlich nicht, weil X ja noch gar nicht erzeugt wurde. Folglich kann so ein Y erst dann an X übergeben werden, wenn der Konstruktor von X bereits abgeschlossen ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

08.12.2014, 21:35

Normalerweise kann man allerdings doch einfach X vor Y konstruieren?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

08.12.2014, 21:55

Ja, aber das zyklische Problem lässt sich eben nicht im Konstruktor lösen. Ich will nicht sagen, dass Init-Methoden sinnvoll sind, dafür sind Konstruktoren da. Es gibt aber eben Fälle, wo man nicht alle Eigenschaften eines Objekts im Konstruktor setzen kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

08.12.2014, 22:22

Und wenn zu viel Logik im Konstruktor steckt ist das auch eher schlecht. Für solche Fälle gibt's sonst auch die schönen Factory- und Builder-Patterns.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

08.12.2014, 22:58

Bei Objekten in einer Spielszene kann ich nicht davon ausgehen im Konstruktor, dass andere Objekte schon erzeugt wurden.
Folglich muss ich damit warten, bis eine spezielle Methode vom SceneManager aufgerufen wird (z.B. Init oder so).

Werbeanzeige