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

09.07.2011, 14:22

Ein paar Fragen zu C++

Hallo.
Ich hab jetzt 2 Bücher durch und im Netz auch schon viel zu C++ gelernt.
Ein paar Probleme mit dem Verständnis habe ich trotz allem, selbst nach dem 5. mal Lesen. :S
Zum einem verstehe ich noch nicht ganz den Sinn von new und delete, gut das Eine reserviert Speicher und das Andere entfernt die Reservierung wieder, aber welchen Nutzen hat das? Kann mir da mal jemand ein sinnvolles Beispiel geben? Am besten kommentiert was das Einzelne tut, so klappt es bei mir vom Lernverständnis am besten. :thumbup:
So und das mit dem this-Zeiger ist auch noch eine Klasse für sich. Was bringt das Teil denn genau? Ich sehe den Sinn darin nicht.
Des weiteren hab ich teilweise meine Probleme zu wissen wann und wie ich den Einsetze, das würde sich aber selbst klären wenn ich den Inhalt näher verstanden habe.
Und das Letzte was mir noch grau ist: Zeiger allgemein. Ich weiß das man damit auf eine Adresse zugreift wo die Variable liegt und bla, bla, bla....
Aber ich blick nicht so wirklich wann ich das Teil z.B. in einer Klasse als Parameter usw. brauche bzw. wie ich das anwende. Ich weiß das man damit den Rückgabewert ersetzen kann in dem man einen Zeiger als Parameter verlangt der dann irgendwie darauf zugreift oder so. :wacko:
Wie gesagt, da verstehe ich Alt-Japanisch.

Ist mir ehrlich gesagt auch echt peinlich, dass ich gerade diese Themen nicht gut beherrsche, da ich doch schon ein paar Spiele geschrieben habe.
Ich danke schon mal für eure Hilfe!

MfG
Check

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

2

09.07.2011, 14:46

Bitte schreib nicht alles fett, das hemmt doch den Lesefluss.

Welche Bücher sind das denn, die du hast?

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

3

09.07.2011, 14:51

Alles von dem genannten sind wichtige Grundlagen.
Mit new und delete wird Speicher reserviert, dass ist wahr. Der reservierte Speicher liegt auf dem dem Heap, nicht auf dem Stack wie die sonstigen Variablen. Der Stack ist bei Programmen meist recht beschränkt, hat man große Datenmengen, macht es mehr Sinn diese auf dem Heap auszulagern. Mit den Begriffen solltest Du noch mehr zu dem Thema finden können.

Der this Zeiger ist ein Zeiger auf die aktuelle Klasse. Mit dem Zeiger kann man alles mögliche Anstellen, explizit auf Attribute zugreifen zum Beispiel:

C-/C++-Quelltext

1
2
3
4
void MyClass::func(int a)
{
    this->a = a;
}


Oder man kann eine Referenz auf das Objekt zurück geben, praktisch und wichtig bei verketteten Listen.

C-/C++-Quelltext

1
2
3
4
MyClass MyClass::getObject()
{
    return this;
}


Zeiger sind sinnvoll, wenn man ein Objekt übergeben möchte, ohne das ganze Objekt jedes mal kopieren zu müssen. Man muss an Funktionen nur den 4Byte Zeiger übergeben und fertig. Referenzen sind dort genauso effizient, nur dass sie noch ein paar weitere Besonderheiten haben.
Es gibt enorm viele Anwendungsmöglichkeiten für Zeiger, die erschließen sich aber daraus, dass man eben mal darüber nachdenkt, was man mit dem Objekt alles anstellen kann auf das man zeigt. Und das ohne jedes mal das komplette Objekt zu übergeben. ^^

Was für Spiele waren das denn, bei denen man ohne diese Sachen ausgekommen ist? Die zu programmieren muss ohne die Techniken viel schwieriger gewesen sein... ^^

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »MCP« (09.07.2011, 15:15)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

09.07.2011, 15:04

Ich glaub dir fehlt einfach Übung. Wichtig ist, dass du deine Werkzeuge kennst. Schreibe ein paar Programme und sobald du eins davon brauchst wirst du dir denken: "hmm, wie soll ich das bloss lösen? ahh, da gibt es doch Zeiger...".
Dynamischen Speicher brauchst du wenn du nicht weißt ob und wieviele Instanzen du von einer Klasse benötigst. Die stl container(vector, list usw.) benutzen das im hintergrund.
Sobald du die Vererbung komplett verstanden hast wird sich dir eine weitere Anwendungsmöglichkeit erschließen ;)

Es wäre übrigens

C-/C++-Quelltext

1
this->a = a;

Weil this ein Zeiger und keine Referenz ist.
"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?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

09.07.2011, 15:10

Hat er wahrscheinlich verwechselt, C++ ist ja afaik auch die einzige Sprache die so verfährt. Bei allen anderen ist es, wie MCP sagte, this.a.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

6

09.07.2011, 15:14

Ja, passiert mir in letzter Zeit häufiger, weil ich an der Arbeit mit C# arbeite. ^^
Zu schnell getippt und nicht korrektur gelesen. Bei Zeigern und C++ wir ja immer der -> Operator benutzt.

7

09.07.2011, 15:27

Von new und delete hab ich jetzt immer noch nicht das wirklich Nützliche verstanden, bzw. was z.B. das machen würde: (angenommen alles ist vorhanden)

C-/C++-Quelltext

1
m_Variable = new CPseudoClass;


Mein Problem mit dem this-Zeiger hab ich echt höchst oberflächlich "beschrieben".
Ich verstehe nicht wozu ich das Teil brauche. Macht nicht

C-/C++-Quelltext

1
this->a = ab;
nicht das Gleiche wie

C-/C++-Quelltext

1
a = ab;
?
Und was genau soll das im Grunde heißen:

C-/C++-Quelltext

1
a->ab();

Ich hab das so verstanden, dass dann für a die Funktion ab gestartet wird. :D Jedenfalls glaube ich das.

Ansonsten scheint mir da echt Übung zu fehlen, ich hab das nicht einmal in einem meiner eigenen Spiele verwendet. :whistling:
Die haben auch dementsprechend zeit in Anspruch genommen. Mir wurde immer gesagt, es sei nicht die optimale Lösung dafür, aber es würde so auch gehen. Teilweise sogar mit erheblichen Leistungsdefizit! ;(
Ich mach jetzt schon echt viel mit der SFML und so, aber man. Das ist schlimm das ich das nicht wirklich verstehen will, btw. sich das nicht so einarbeitet.
Aber alle diese Themen habe ich mindestens 5 mal in der Konsole auf eigene Faust durch genommen.
Ich danke für weitere Antworten und für die, die schon geschrieben wurden.

MfG

Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

09.07.2011, 16:00

Beispiel für "new":
Ein Benutzer gibt am Bildschirm eine Zahl ein und diese Zahl soll angeben wie viele "Kekse" ein "Bäcker" im Programm backen soll. Ohne "new" könnten gar keine neuen Objekte von Keksen erzeugt werden, denn woher soll der Speicher für diese kommen - immerhin ist die Anzahl ja erst bekannt, wenn der Benutzer sie eingibt. Daher also "new": anfordern von neuem Speicher und Erstellung eines neuen Objekts in diesem Speicherbereich.
Delete macht genau das Gegenteil. Es löscht das Objekt und gibt den benutzten Speicher wieder frei, sobald der Keks nicht mehr gebraucht wird oder nicht mehr existieren soll.
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]

9

09.07.2011, 16:39

Also wäre:
EDIT: Sorry, irgendwie will der keine Zeilenumbrüche machen.... :(

C-/C++-Quelltext

1
CKekse Cookie=NULL;Cookie = new CKeske;Cookie->Backen();delete Cookie;

richtig zu nutzen und

C-/C++-Quelltext

1
CKekse Cookie=NULL;Cookie = new CKekse;//Irgendwas....delete Cookie;Cookie.Essen();

falsch, da Cookie nicht mehr vorhanden ist?



Also in new und delete kann ich mich jetzt nochmal mit Buch neu sehr gut einarbeiten, aber beim this Zeiger gibt es noch Probleme.
Warum kann ich zum Beispiel nicht das sagen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int xPos=-1;
int yPos=-1;

cout << "X-Koordinate: ";
cin >> xPos;
cout << endl << "Y-Koordinate: ";
cin >> yPos;
cout << endl;

CGeschoss *pSpieler=NULL;
CGeschoss *pGegner=NULL; 
pSpieler = new CGeschoss;
pGegner = new CGeschoss (xPos, yPos);
pSpieler->SCHIESS(); 
pGegner->SCHIESS(); 
delete pSpieler; 

pSpieler=0;
delete pGegner;
pGegner=0;

cin.get();
cin.ignore();
return(0);
}


Auch ohne this Zeiger, also "." statt "->" geht es nicht. :thumbdown:
Naja, ich glaube da heißt es nur einarbeiten, oder?
Hätte noch jemand ein paar Ratschläge und Beispiele o.Ä. parat? :thumbup:

MfG
Check

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Checkmateing« (09.07.2011, 17:43)


10

09.07.2011, 18:09

Was geht denn da nicht?

Den this-Zeiger brauchst du prinzipiell erstmal nicht zu benutzen. Wenn du ihn wirklich brauchst wirst du das merken und dann auch wissen, wozu er da ist. Ignorier ihn einfach aber merk dir, dass es sowas gibt.

Werbeanzeige