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

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

1

23.04.2016, 14:14

[C++] Warum funktioniert das ? / Wie funktioniert das?

Hey Leute,

ich habe mir ein neues Buch über SFML gekauft. Nun fängt er in dem Buch an eine Game Klasse zu programmieren. Hier die Game.hpp dazu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once

#include "SFML\Graphics.hpp"

class CGame
{
    public:
           CGame ();
          ~CGame ();

        void Run ();              //Der Main Loop

    private:
        void ProcessEvents ();    //Die Eingaben des Spielers bearbeiten und abfangen
        void Update ();           //Die Game Logik Updaten
        void Render ();           //Grafiken Rendern

    private:
        sf::RenderWindow m_Window;  //Das Hauptfenster
        sf::CircleShape  m_Player;  //Die Grafik des Spielers
};


Habe dann weiter gelesen und gedacht man muss das Fenster ja jetzt im Konstruktor mit m_Window = new sf::RenderWindow (sf::VideoMode ... erstellen. Jedoch macht er es im Buch anders und zwar so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include "Game.hpp"

//Konstruktor
//
//Aufgabe: Fenster erstellen und Werte des Spielers setzen
//

CGame::CGame () : m_Window (sf::VideoMode (800, 600), "SFML Application") , m_Player ()
{
    

}


Meine Frage nun. Warum bzw Wie funktioniert das? und was hat es außerdem mit dem m_Player auf sich. Es ist doch eine Instanz einer Klasse. Wieso wird es nun wie eine Funktion behandelt und was bringt das überhaupt das da hinzuschreiben ?

MfG Inatrox
cout << "Programmieren muss sein" << endl;

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

23.04.2016, 14:37

Das nennt sich Initialisierungsliste. Google mal danach.

3

23.04.2016, 14:42

Das nennt sich Initialisierungsliste.

Wie der Name schon sagt werden damit member einer Klasse initialisiert.
Muss man so machen für member (die selber Klassen sind) die kein default Konstruktor haben.

Edit: David war etwas schneller.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

4

23.04.2016, 14:48

Danke :D
cout << "Programmieren muss sein" << endl;

sw1

Frischling

  • Private Nachricht senden

5

23.04.2016, 14:53

Hallo,

durch

C-/C++-Quelltext

1
2
3
CGame::CGame () : m_Window (sf::VideoMode (800, 600), "SFML Application") , m_Player ()
{
}


wird ja der Konstruktor der Klasse CGame definiert. Nach dem Doppelpunkt (":") können Konstuktoren der Objekte innerhalb der Klasse aufgerufen werden.

Wenn du ein Objekt der Klasse CGame erstellst werden ja auch direkt die Objekte innerhalb der Klasse erstellt (hier m_Window und m_Player). Beim erstellen dieser Objekte werden wiederum deren Konstruktoren aufgerufen (falls keiner vorhanden ist wird der Standardkonstruktor aufgerufen). Durch die Notation wie in deinem Beispiel kann nun direkt angegeben werden, welcher Konstruktor beim erstellen der Objekte aufgerufen werden soll (die Klasse sf::RenderWindow hat z.B. unterschiedliche Konstruktoren, durch aufrufen des hier angegebenen Konstruktor wird sofort ein neues Fenster erstellt). Den Aufruf m_Player () hätte man auch weglassen können, dieser Konstruktor würde auch ohne die direkte Anweisung aufgerufen.

Zitat

m_Window = new sf::RenderWindow (sf::VideoMode ...


Das ist hier nicht nötig, soweit ich weiß kann ein neues Fenster mit sf::RenderWindow::create(...) erzeugt werden. Dies ist hier sogar Falsch, da m_Window kein Zeiger ist.
Du kannst dich eventuell nochmal über Zeiger/Referenzen und Konstruktoren informieren.


edit: Zu spät :(

6

23.04.2016, 15:08

Richtig, stets new bei Klassen zu verwenden ist Java und falsch. In C++ gibt es mehrere Möglichkeiten, Objekte zu erstellen: statisch, d.h. als globale Variablen oder lokale, als static markierte Variablen, wobei bei Programmanfang und -ende Kon- und Destrukor aufgerufen werden bzw. sobald die Funktion das erste mal aufgerufen wird, welche als static markierte Variablen verwendet. Weiterhin gibt es automatisch Verwaltete Objekte, das sind lokale Variablen, dessen Kon- und Destruktor am Anfang/Ende eines Blocks, markiert durch { und }, aufgerufen werden. Zum Schluss gibt es noch dynamische Objekte, das sind mit new und delete verwaltete. new und delete kommen in modernem C++ faktisch nicht vor und sind durch Dinge wie Smartpointer und deren make_*-Funktionen gekapselt.

Werbeanzeige