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

18.07.2012, 23:35

new operator

Hallo Forum,
ich habe momentan etwas Probleme mit dem new-Operator. Im Buch "C++ für Spieleprogrammierer" im 7 Kapitel kommt folgender Code-Abschnitt vor:

C-/C++-Quelltext

1
2
3
4
CRaumschiff *pSchiff = 0;
pSchiff = new CMinenleger;
pSchiff->Starten();
pSchiff->Landen();


Hier wird ein Pointer mit dem Typ einer Klasse deklariert, doch was passiert in der zweiten Zeile? CMinenleger ist auch eine Klasse die von der Basisklasse "CRaumschiff" geerbt hat.
Ich verstehe nur nicht was der new-Operator nun im heap reserviert. ?(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.07.2012, 23:43

Was da passiert, nennt sich Polymorphie. Es wird ein Objekt vom Typ CMinenleger erzeugt. Da CMinenleger von CRaumschiff erbt, ist jeder CMinenleger auch ein CRaumschiff. Daher kann überall, wo ein CRaumschiff* erwartet wird, auch ein CMinenleger* verwendet werden.

3

19.07.2012, 00:51

Wie viel Speicher reserviert dann new CMinenleger im Heap? Verwirrt mich ein bisschen, so viel wie die Klasse CMinenleger alleine wert ist oder so viel wie CRaumschiff und CMinenleger zusammen wert sind?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.07.2012, 01:01

Jeder CMinenleger enthält ein CRaumschiff...

5

19.07.2012, 01:04

Jeder CMinenleger enthält ein CRaumschiff...

Und das selbst wenn die Klasse beispielsweise protected: variablen hat? und wird somit bei der Erstellung einer Instanz von CMinenleger auch der Konstruktor von CRaumschiff ausgeführt? :wacko:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

19.07.2012, 01:12

Jeder CMinenleger enthält ein CRaumschiff...

Und das selbst wenn die Klasse beispielsweise protected: variablen hat?

natürlich

und wird somit bei der Erstellung einer Instanz von CMinenleger auch der Konstruktor von CRaumschiff ausgeführt? :wacko:

selbstverständlich


Durch die Vererbungsrelation bekommt jeder CMinenleger im Prinzip eine versteckte Instanz von CRaumschiff. Du kannst dir das im Prinzip so vorstellen:

C-/C++-Quelltext

1
2
3
4
class CMinenleger : public CRaumschiff
{
  // ...
};


Wird zu

C-/C++-Quelltext

1
2
3
4
5
6
class CMinenleger
{
  CRaumschiff base;

  // ...
};


Wobei ein Zeiger auf einen CMinenleger nun zusätzlich implizit in einen Zeiger auf das im Minenleger enthaltene CRaumschiff umgewandelt werden kann (genau das ist der entscheidende Unterschied zwischen Vererbung und einfach nur ein CRaumschiff in den Minenleger packen):

C-/C++-Quelltext

1
2
3
4
CMinenleger blub;

CMinenleger* minenleger = &blub; // <- zeigt auf blub
CRaumschiff* raumschiff = minenleger; // <- zeigt auf blub.base

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (19.07.2012, 01:20)


7

19.07.2012, 01:38

Gut das wäre geklärt :) Aber warum wird, wenn der Pointer eine Instanz von CRaumschiff auf einem CMinenleger grossem, reservierten Speicher im Heap legt auch der Konstruktor von CMinenleger ausgeführt, obwohl sich nur die Basis in einem CMinenleger grossen Speicher befindet?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

19.07.2012, 01:39

Sry, die letzte Frage hab ich nicht verstanden. Wenn du schreibst new CMinenleger wird ein CMinenleger erzeugt, welcher wiederum ein CRaumschiff enthält. Der Konstruktor von CMinenleger ruft implizit den Konstruktor von CRaumschiff auf...

9

19.07.2012, 01:43

So ist das oke, das klärt alles danke, denn im Buch stand lediglich, dass der new-Operator nur Speicher im Heap reserviert, nicht aber, dass er ihn auch beschreibt. :dash: :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

19.07.2012, 01:45

Der new Operator reserviert Speicher und konstruiert ein Objekt in diesem Speicher... ;)

Werbeanzeige