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

21.11.2009, 14:55

Klassenaufruf

Ich glaube ich habe nicht ganz den unterschied zwischen

C-/C++-Quelltext

1
Raumschiff->ZeigeName();

und

C-/C++-Quelltext

1
Raumschiff.ZeigeName();

verstanden.
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

2

21.11.2009, 15:08

Beim ersten greifst du auf ein Objekt auf dem Heap zu und beim 2. greifst du auf ein Objekt auf dem Stack zu.

Das erste erstellst du mit new, das andere ohne.
Pointer sind ein wichtiges Thema, schau dir das lieber nochmal genau an bis du genau weist wo der Unterschied ist.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

3

21.11.2009, 15:10

-> wird verwendet, wenn es sich bei Raumschiff um einen Zeiger auf eine Klasseninstanz handelt, . wenn es direkt eine Instanz ist.

d.h.

C-/C++-Quelltext

1
2
CRaumschiff *Raumschiff = new CRaumschiff;
Raumschiff->ZeigeName();


und

C-/C++-Quelltext

1
2
CRaumschiff Raumschiff;
Raumschiff.ZeigeName();


ist es nun klarer?

Edit: Da ist mir ja einer zuvorgekommen^^

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

MasterK

Frischling

Beiträge: 92

Wohnort: Koblenz

Beruf: Teamleiter Softwareentwicklung

  • Private Nachricht senden

4

21.11.2009, 15:19

Zitat von »"k|haos"«

Beim ersten greifst du auf ein Objekt auf dem Heap zu und beim 2. greifst du auf ein Objekt auf dem Stack zu.

Das erste erstellst du mit new, das andere ohne.
Pointer sind ein wichtiges Thema, schau dir das lieber nochmal genau an bis du genau weist wo der Unterschied ist.


Also die antwort von CBenni::O is aber richtiger :P
Das objekt muss ja nicht auf dem heap liegen. Kann ja auch einfach ein pointer auf ein objekt sein, das auf dem stack liegt. Genauso kannste natürlich auch das objekt auf dem heap vorher dereferenzieren (was ja "->" im endeffekt sowieso macht).

5

21.11.2009, 15:26

Naaaa gut,
aber wollten ja nicht gleich ganz oben anfangen ;)

6

21.11.2009, 15:28

Zitat von »"k|haos"«

Naaaa gut,
aber wollten ja nicht gleich ganz oben anfangen ;)
Noch weniger wollen wir aber falsche Tatsachen vermitteln. Mit Heap und Stack hat das absolut nichts zu tun.

Zur Programmierung mit Zeigern in C++ kann ich übrigens diesen Artikel empfehlen.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

7

21.11.2009, 15:38

Der operator -> ist soetwas wie eine Kombination aus Derefferenzierung und dem operator .
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
EineKlasse ObjektVonEineKlasse; // Ein Objekt von der Klasse "EineKlasse" erstellen

cout << ObjektVonEineKlasse.EinWert; // Den Wert der Membervariablen "EinWert" des Objekts "ObjektVonEineKlasse" ausgeben

EineKlasse* ZeigerAufEinKlassenobjekt = &ObjektVonEineKlasse; // Einen Zeiger auf das Klassenobjekt ermitteln und in "ZeigerAufEinKlassenobjekt" speichern

cout << ZeigerAufEinKlassenobjekt->EinWert; // gibt ebenfalls den Wert der Membervariable "EinWert" des Objekts "ObjektVonEineKlasse" aus, da der Zeiger auf dieses Klassenobjekt zeigt

// entspricht dieser Zeile

cout << (*ZeigerAufEinKlassenobjekt).EinWert;


Anderes Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
CRaumschiff Raumjäger;
Raumjäger.Name = "abc";
cout << Raumjäger.Name; // gibt abc aus

CRaumschiff* pRaumschiff = &Raumjäger;
cout << pRaumschiff->Name; // gibt ebenfalls abc aus

cout << Raumjäger->Name; // Syntaxfehler; Raumjäger ist kein Zeiger

cout << pRaumschiff.Name; // Syntaxfehler; pRaumschiff ist nur ein Zeiger

cout << (*pRaumschiff).Name; // gibt abc aus
Signaturen werden überbewertet

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

21.11.2009, 15:49

long story short:

C-/C++-Quelltext

1
blub->abc;


is (operator overloading jetzt mal außen vor) nur ne kurzschreibweise für

C-/C++-Quelltext

1
(*blub).abc;

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

21.11.2009, 16:28

habe mich gerade gefragt was sinnvoller ist, es im Heap zu erstellen oder im Stack und hab das gefunden..interessant http://tutorial.schornboeck.net/stack_heap.htm
New Project: Operation CityRacer

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

21.11.2009, 16:39

Ich persönlich mag den Stack (oder besser automische Variablen) sehr gerne, weil er sehr viel Speicherverwaltungs Overhead vermeidet.

Das ist das, was ich an gewissen anderen Sprachen nicht mag, wenn man alles sozusagen im Free Store erstellt, auch wenn man exakt weiss, wie lange das Objekt lebt, respektive man es nur einen kurzen Moment braucht.

Und das ist mir aufgefallen, dass man sehr oft gar keinen dynamischen Speicher braucht. Man kann sehr viel intuitiver mit automatischem Speicher verwalten, da man meistens immer genau weiss, wie lange ein Objekt lebt.

Klar kann man argumentieren, dass man so den Aufwand des zerstören von Objekten dahin verschiebt, wo man Zeit hat usw., aber es ist nicht unbedingt nötig. Und wenn man tatsächlich Objekte hat, welche ein wenig länger brauchen für die Deallokation, dann werden die wahrscheinlich eh auch bereits schon dynamisch angelegt.

Also in C++ ist es sicher sinnvoller wenn möglich alles auf dem Stack zu machen und nur mit gutem Grund (grosse Blöcke, unbekannte Lebensdauer usw.) etwas dynamisch zu allokieren.

Werbeanzeige