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

TigerClaw25

unregistriert

1

07.04.2013, 17:10

New und delete

Kurze Frage an die Experten.

Wenn ich eine Instanz erzeuge, dann meistens so:

C-/C++-Quelltext

1
2
3
4
5
CSound *mSound = NULL;
mSound = new CSound;
...
...
...


Hat das etwas mit dem Konstruktor CSound::CSound zutun bzw. mit den Membervariablen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
CSound::CSound(int audiorate, Uint16 audioformat, int audiochannels, 
               int audiochunksize)
{
   // Membervariablen setzen 
   m_audiorate = audiorate; 
   m_audioformat = audioformat; 
   m_audiochannels = audiochannels; 
   m_audiochunksize = audiochunksize;

   //Zeiger auf Null setzen 
   m_psound = NULL;
   m_pmusic = NULL; 
} // Konstruktor


Die beiden Membervariablen sind gleich Null.

Diese haben aber nichts mit der Instanz der Klasse zutun. Somit muss ich, wenn ich korrekt arbeite, das Ganze auch bei der Erzeugung einer neuen Instanz auf Null setzen ... oder gibt es eine Möglichkeit im Konstruktor das Ganze so zu handhaben, dass alle Instanzen, die man erstellt, anfangs NULL sind ?

2

07.04.2013, 17:37

Ich glaube du hast die Ganze Thematik noch nicht ganz verstanden. Wenn du new anwendest, wird ein komlett eigenständiges Objekt der Klasse erstellt(Instanz). Dabei wird automatisch der Konstruktor aufgerufen.
Da du hier einen überladenen Konstuktor hast, musst du beim erzeugen mit new auch die Parameter angeben. Also etwa folgendermaßen:

C-/C++-Quelltext

1
2
3
CSound *mSound = NULL;

mSound = new CSound(10, 5, 10, 5);


Die Aussage, dass die Membervariablen nichts mit der Instanz zu tun haben ist völlig falsch. Jede Instanz hat ihre eigenen Membervariablen mit eigenen Werten (statische Variablen mal ausgenommen).

TigerClaw25

unregistriert

3

07.04.2013, 17:48

C-/C++-Quelltext

1
2
3
4
5
    // Sound laden
    m_pMusic = NULL; 
    m_pMusic = new CSound (44100, AUDIO_S16SYS, 2, 4096);
    m_pMusic->LoadMusic("Data/test.wav",100);
    m_pMusic->PlayMusic();


Hab ich alles gemacht. Mir gings nur darum, dass ich ja für jede Instanz, die ich erzeuge, unabhängig von Membervariablen oder FUnktionen immer = NULL setzen muss ...

4

07.04.2013, 18:02

Sorry, ich verstehe nicht genau, was du auf Null setzen willst. Wenn es um die Membervariablen geht:

C-/C++-Quelltext

1
2
3
//Zeiger auf Null setzen 
m_psound = NULL; 
m_pmusic = NULL;

Das geschieht ja im Konstruktor automatisch.
Wenn du das meinst:

C-/C++-Quelltext

1
CSound *mSound = NULL;

Muss nicht unbedingt, da du ja sofort danach ein Objekt erzeugst und den zeiger darin speicherst. Sonst wüsste ich nicht, was du gleich NULL setzen willst.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

07.04.2013, 18:32

Sorry, ich verstehe nicht genau, was du auf Null setzen willst. Wenn es um die Membervariablen geht:

C-/C++-Quelltext

1
2
3
//Zeiger auf Null setzen 
m_psound = NULL; 
m_pmusic = NULL;

Das geschieht ja im Konstruktor automatisch.

Nein? Das geschieht nicht automatisch. Das muss man schon selbst hinschreiben, sonst gibt es im Release-Mode herrliche Probleme und Fehler.
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]

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

6

07.04.2013, 18:43

Hat er doch im Code hingeschrieben !

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

07.04.2013, 19:20

Ja, hat er. Michi sagte aber das geht automatisch. Egal wie es gemeint war, das stimmt so natürlich nicht, denn es passiert nicht automatisch. Und damit keine Missverständnisse aufkommen, habe ich das mal explizit zum Ausdruck gebracht.
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]

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

8

07.04.2013, 19:33

Hast natülich recht ;) dass könnte man missverstehen.

9

07.04.2013, 20:07

@BlueCobold: Ich meinte mit automatisch hier, dass es bei hier gesposteten Code "automatisch" passiert, sprich mit dem Konstruktoraufruf. Generell wird das natürlich nicht automatisch gemacht. :D

FSA

Community-Fossil

  • Private Nachricht senden

10

07.04.2013, 20:15

TigerClaw25: Du hast das Thema Zeiger nicht verstanden oder übersprungen?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige