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

29.03.2020, 12:13

C++ und SFML - Verwirrung um Initialisierungsliste

Hallo. Habe hier mal wieder einen Codeausschnitt:

Quellcode

1
2
3
4
struct SnakeSegment {
    SnakeSegment (int x, int y) : position(x, y) {}
    sf::Vector2i position;
};


Wenn ich das richtig sehe, dann wird mit SnakeSegmengt(int x, int y) der Konstruktor deklariert und gleichzeitig implementiert - wegen der {}-Klammern. Nur wie werden diese übergebenen Werte verwendet? - die {}-Klammern sind ja leer.

Und nach dem : wird anscheinend der Konstruktor von sf::Vector2i position; aufgerufen. Aber woher weiß der Konstruktor den Datentyp von x und y? Und wie kann man die Werte an den Konstruktor übergeben?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

29.03.2020, 12:34

Zitat

Nur wie werden diese übergebenen Werte verwendet?

Die übergebenen Werte werden in der Initialisierungsliste benutzt, um den Member position zu initialisieren, wie du schon selbst erkannt hast.

Zitat

die {}-Klammern sind ja leer.

Ja, weil position schon durch die Initialisierungsliste initialisiert wird, und sonst gibt's in diesem Beispiel halt nichts zu erledigen.
Man könnte auch ohne Initialisierungsliste arbeiten. Dann hätte man keinen leeren Konstruktor, sondern würde position = sf::Vector2i(x, y); reinschreiben. Kommt in diesem Fall (nicht verallgemeinern!) auf's gleiche raus, man spart sich mit der Initialisierungsliste halt ein bisschen Schreibarbeit.

Zitat

Aber woher weiß der Konstruktor den Datentyp von x und y?

Der Datentyp von x und y steht doch da, nämlich int.

Zitat

Und wie kann man die Werte an den Konstruktor übergeben?

An welchen Konstruktor, den von SnakeSegment? Na ganz normal halt: SnakeSegment s(10, 20);

3

29.03.2020, 16:37

Cool. Danke für die Hilfe. :)

Eine Frage hätte ich da aber noch.

Quellcode

1
2
3
4
5
6
7
struct SnakeSegment{
    SnakeSegment(int x, int y) {
        position = sf::Vector2i(x, y);
    }
    sf::Vector2i position;

};


Wie kann es sein, dass man einfach position = sf::Vector2i(x,y); schreiben kann bevor man "position" deklariert hat?
Ich würde es logischer finden wenn man erst sf::Vector2i position; schreiben muss und dann erst auf "positon" zugreifen kann. Vorher dürfte dem Kompiler "position" gar nicht bekannt sein.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

29.03.2020, 16:49

Im Fall von Klassen/Strukturen ist es egal, in welcher Reihenfolge die Deklaration von Member-Variablen und -Methoden bzw. Konstruktoren, Destruktor, Operatoren etc. erfolgt. Der Compiler macht das schon! ;)
Du hast aber Recht: Beim Lesen des Codes von oben nach unten ist es für das Verständnis einfacher, wenn man zuerst einmal sieht, welche Member-Variablen es überhaupt gibt.

Jonathan

Community-Fossil

  • Private Nachricht senden

5

29.03.2020, 23:56

Im Fall von Klassen/Strukturen ist es egal, in welcher Reihenfolge die Deklaration von Member-Variablen und -Methoden bzw. Konstruktoren, Destruktor, Operatoren etc. erfolgt. Der Compiler macht das schon!

Dem sollte man vielleicht noch eines hinzufügen: Die Reihenfolge ist in sofern egal, als das der Kompilier die Deklarationen findet und dann kennt, das war ja genau justmytwocents Frage. Allerdings ist die Reihenfolge wichtig, wenn es um das Thema Initialisierung geht: Angenommen man hat eine Klasse Game mit den Member-Variablen PlayerSprite und SpriteManager. Wenn PlayerSprite nun einen Initialisierten SpriteManager benötigt muss dieser in der Klasse zuerst deklariert werden. Das sollte man im Hinterkopf behalten und später bei komplexeren Programmen nochmal nachlesen wie genau das denn mit der Initialisierungsreihenfolge genau funktioniert.
Lieber dumm fragen, als dumm bleiben!

6

31.03.2020, 20:54

Danke für die Antworten. :)

Werbeanzeige