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

24.06.2012, 16:21

Anfängerfrage: new-Operator und "unsauberer Speicher"

Hallo zusammen,

wie bereits in einem anderen Thread erwähnt komme ich aus der C#-Wirrwarrwelt und bin es gewohnt, dass ich wenn ich eine Instanz einer Klasse mit new erzeuge, dessen Member alle auf Standardwerte gesetzt sind (also ein bool auf false, ein int auf 0 usw.).

In C++ scheint dies ja nicht der Fall zu sein. Pointer-Membervariablen zeigen auf die typischen zufälligen Bitmuster-Adressen wie 0xCDCDCDCD, und ints usw. haben rein zufällige Werte (ich nutze den VC++8 Compiler).

Nun würde ich so vorgehen, dass ich im Konstruktor alle Variablen manuell auf Standardwerte setze, also z.B.:

C-/C++-Quelltext

1
2
3
4
5
6
Game::Game()
{
    _beispielInt = 0;
    _fenster = NULL;
    // ...
}


Aber geht das nicht auch leichter? Bei Strukturen schreibe ich ja immer etwas wie

C-/C++-Quelltext

1
D3DPRESENT_PARAMETERS presentationParams = { };

...damit die Struktur leer ist, wie ich es von C# gewohnt bin. Aber bei Klassen geht das anscheinend nicht.

Wie gehe ich hier vor?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

24.06.2012, 16:37

Du solltest sowieso immer jedes Datenelement der Klasse und eventuelle Basisklassen in der Initialisierungsliste aufzählen, dann kannst du sie auch gleich mit dem Standardwert initialisieren. ;)

Was hat das eigentlich mit dem new-operator zutun?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

24.06.2012, 16:39

Nun genau dafür ist ja der Konstruktor da. Damit das Objekt nach dem Erstellen einen definierten Zustand hat. Und den definierst du nun einmal.

Strukturen und Klassen unterscheiden sich in C++ nur in der Hinsicht, das bei Strukturen standardmäßig alles public, anstatt private ist. Dementsprechend sollte dein Vorgehen also auch bei Klassen funktionieren.

4

24.06.2012, 16:44

Dazu muss ich sagen, dass die Spiel-Klasse ein Singleton ist:

C-/C++-Quelltext

1
2
3
4
5
    Game* Game::Instance()
    {
        static Game* instance = new Game();
        return instance;
    }


Es klingt für mich hilfloses Wrack nun so, dass ich

C-/C++-Quelltext

1
2
3
4
5
    Game* Game::Instance()
    {
        static Game* instance = { };
        return instance;
    }

...schreiben solle? Das meckert mir der Compiler allerdings an:

Zitat von »Mein bitchiger Compiler«

error C2552: 'instance': Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht möglich

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

5

24.06.2012, 16:51

"instance" ist ein Pointer.

6

24.06.2012, 16:57

Und wie mache ich es dann richtig?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

24.06.2012, 17:08

Im Game() Konstruktor alle Werte initialisieren?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class Game{
    public:
        int blub;

        Game* instance(){
            return new Game();
        }

    private:
        Game(){
            blub = 0;
        }
}


Ok da fehlt noch bisschen was... aber vom Prinzip her. Rest siehe hier.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »DeKugelschieber« (24.06.2012, 17:15)


8

24.06.2012, 17:18

Lest ihr eigentlich meinen Eingangspost noch richtig?
Ich fragte, ob es sinnvollere Methoden gibt anstatt alles im Konstruktor zu initialisieren.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

24.06.2012, 17:42

Singleton erstmal sein lassen.

Und dann: Nein das IST der sinnvolle Weg.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

24.06.2012, 17:55

Aber bitte die Initialisierungsliste benutzen!
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige