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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

21

05.07.2017, 16:52

Es wird ein anderer Konstruktor aufgerufen, den du nicht beobachtest: Der Kopierkonstruktor. Daher werden also 2 Konstruktoren und auch 2 Destruktoren insgesamt ausgeführt.

Der Doppelpunkt hat im Konstruktor nichts mit Vererbung zu tun, sondern signalisiert eine nachfolgende Initialisierungsliste.
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]

TigerClaw25

unregistriert

22

05.07.2017, 18:08

Merci für den Hinweis.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

05.07.2017, 20:54

Bei Auflage 4 vom Buch findest du die Themen
Initialisierungsliste auf Seite 354, 358
Kopierkonstruktor auf Seite 365
Die Themen solltest du dir noch mal genauer ansehen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

24

05.07.2017, 22:41

In einem Fall hat der Doppelpunkt auch hier etwas mit Vererbung zu tun. Du kannst nämlich hier auch einen (Nicht-Standard-)Konstruktor der Elternklasse aufrufen, bzw. ist das sogar die einzige Möglichkeit dies zu tun.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Automobil
{
public:
    Automobil(int gewicht); // Nicht-Standard-Konstruktor, da er einen Parameter erwartet
};

class ZehnTonnenAutomobil : public Automobil
{
public:
    ZehnTonnenAutomobil()
        : Automobil(10000) // Hier wird der Konstruktor von Automobil aufgerufen mit gewicht = 10000
        , anzahlAchsen(4) // Zuweisung an Member-Variable, wie du sie schon kennst
    {
    }

private:
    int anzahlAchsen;
};


BTW, gerade habe ich zum ersten Mal gesehen, wie man Exceptions fangen kann, die in der Initialisierungsliste geworfen werden: https://stackoverflow.com/a/120943/1044572

TigerClaw25

unregistriert

25

07.07.2017, 19:12

Ok, Danke. Jetzt habe ich zu Zeigern aber doch noch eine Frage.

Bezüglich Klassen und "new" kann ich eine Memberfunktion wie folgt aufrufen:

C-/C++-Quelltext

1
2
3
pSpieler->ZeigeDaten();
oder
(*pSpieler).ZeigeDaten();


Bei Arrays mit "new" sieht das aber anders aus:

C-/C++-Quelltext

1
pSpielerliste[i].ZeigeDaten();


Aber ich glaube, ich habe mir soeben die Frage selber beantwortet. Man möchte ja direkt auf die Werte/Funktionen zugreifen.

C-/C++-Quelltext

1
pSpielerliste.ZeigeDaten();  //das ist falsch, da es sich hierbei um ein Array handelt.


wäre in dem Fall falsch, da dadurch die Anfangsadresse und nicht der Wert des Arrays im Raum steht. Da ich aber mit "[ i ]" eben die einzelnen Elemente anspreche, liegt mir auch nicht die Anfangsadresse vor, sondern die einzelnen Elemente, also die Werte,

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

26

07.07.2017, 19:17

Wichtig: Ein Zeiger ist ein Zeiger (ach was!). Er zeigt immer nur auf ein einzelnes Objekt. Der Zeiger weiß nicht, ob dahinter noch weitere "zusammengehörige" Objekte kommen oder nicht. Wenn man nur den Zeiger betrachtet, gibt es also keinen Unterschied, ob man pSpieler = new Spieler; oder pSpieler = new Spieler[100]; geschrieben hat.

Denk dran, dass A[B] nichts anderes bedeutet als *(A+B), wenn eins von beiden ein Zeiger ist und das andere eine Ganzzahl.

Übrigens könntest du auch pSpieler[0].TuWas(); schreiben statt pSpieler->TuWas(); oder (*pSpieler).TuWas();. Ist alles gleich, solange du keine schrägen Sachen machst.

PS: Bitte in Zukunft die Code-Tags richtig schließen, ich habe das vorher schonmal bei dir repariert.

TigerClaw25

unregistriert

27

07.07.2017, 19:30

oder

C-/C++-Quelltext

1
&pSpieler[1]->Init();  // müsste auch gehen


Mir gings nur darum, wenn ich das richtig verstanden habe, dass ich bei Zeigern auf Variablen entweder

C-/C++-Quelltext

1
2
3
pSpieler->ZeigeDaten();
oder
(*pSpieler).ZeigeDaten();


benutze. Soweit Verstehe ich das auch. Wenn ich aber ein Array habe, greife ich über "[]" auf die einzelnen Elemente zu. Also entfällt bei der Schreibweise mit dem Punktoperator das Sternchen "*" und ich schreibe

C-/C++-Quelltext

1
2
pSpieler = new xyz[4];
pSpieler[1].ZeigeDaten();


Habe ich das so richtig interpretiert? Kann man die letzte Codezeile für das Array so modifizieren, dass ich den "Pfeil"-Operator verwenden kann oder braucht man das bei Zeiger auf Arrays nicht?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (07.07.2017, 20:08)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

28

07.07.2017, 19:34

Ja, wie gesagt: pSpieler[1].TuWas(); ist das gleiche wie (pSpieler + 1)->TuWas();.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

07.07.2017, 19:37

Der Array enthält Werte. Der Zeiger zeigt lediglich auf den Array. Du kannst natürlich auch einen Array von Pointern allokieren, aber das wäre was ganz anderes.
Es ist also total logisch, dass für ein Element eines Arrays die Verwendung einer Methode über den Punkt erfolgt, denn wie gesagt ist in dem Array ein Element und kein Pointer.
Dein letztes Code-Beispiel ist falsch. Du allokierst nur einen einzigen Spieler, folglich ist das ein Array mit einem einzigen Element und der erste Index muss 0 lauten und nicht 1.
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]

TigerClaw25

unregistriert

30

07.07.2017, 20:08

Hatte beim letzten Beispiel die Anzahl vergessen ;)

Werbeanzeige