Dynamische Anzahl von Instanzen?
-
Hallo Com, ich hab eine kleine Frage zu folgendem Quellcode, welcher aus meinem C++ Buch stammt.
//VARIABLEN// int AnzahlSpieler; CSpieler *pSpielerListe = NULL; //ABFRAGE// cout << "Geben sie die Anzahl der Spieler an: "; cin >> AnzahlSpieler; pSpielerListe = new CSpieler [AnzahlSpieler]; //SCHLEIFEN// for (int i=0; i<AnzahlSpieler; i++) { cout << "Spieler " << i+1 << endl; pSpielerListe[i].Init(); cout << endl; }Das ist jetzt natürlich nur ein Teil von dem Quellcode, der sollte allerdings reichen um mein Problem zu schildern. ->
In Zeile 11 wird ja so viel Speicherplatz auf den Heap reserviert, wie es die Variable "AnzahlSpieler" vorgibt. Allerdings verstehe ich nicht ganz, warum in Zeile 4 dafür ein Zeiger deklariert wird.
Bisher dachte ich, dass Zeiger dazu da sind um Beispielsweise Variablen nicht unnötig auf dem Stack zu tun.
Könnte mir bitte jemand erklären warum hier pointer benutzt werden?
-
Dein C++-Buch vermittelt veralteten Blödsinn. Sowas würde man niemals tun. Wirf das Buch weg und hol dir ein neues:
Bücherliste
-
Danke erst mal für die Bücherliste. Ich verstehe nicht so ganz, wie du aus diesem kleinen Beispiel schließen willst, dass das Buch nur Mist übermittelt.
Zugegeben, es ist mittlerweile schon ein paar Jahre alt, aber sind Dinge wie Konstruktor, Destruktor, new/delete nicht Sachen die immer noch sehr oft in der Spieleprogrammierung angewendet werden?Es geht mir in erster Linie darum, die absoluten Grundlagen von C++ zu kennen.
Ich benutze das Buch "C++ für Spiele-Programmierer (2. Auflage)
-
new,new[],deleteunddelete[]wird in modernem C++ kaum noch verwendet; wenn, dann nur gekapselt in Smart-Pointern (z.B.std::unique_ptr) oder STL-Containern (z.B.std::vector). Das Prinzip, Speicher automatisch verwalten zu lassen, ist ein Teil von RAII.Ungarische Notation (
CSpieler,pSpielerListe) war schon unangebracht, als es aufkam.NULList mit C++11 auch nicht mehr aktuell, heute würde mannullptrverwenden.Und ja, du wirst auch in aktuellen Spielen und entsprechenden Engines noch Uraltcode finden. Sogar recht häufig. Hängt damit zusammen, dass viele Spieleentwickler sich so sehr auf neuste Grafikfeatures konzentrieren, dass sie codetechnisch ein Jahrzehnt verschlafen haben.
-
Fabolous12 schrieb:
Könnte mir bitte jemand erklären warum hier pointer benutzt werden?
new[]alloziert den Speicher, konstruiert dort die Objekte und gibt Dir einen Zeiger auf den Anfang des Arrays zurück.Wie willst Du später auf die Objekte zugreifen, wenn Du Dir
new[]s Rückgabewert nicht merkst?Der Zeiger auf den allozierten Speicherbereich ist sogar extrem wichtig, weil Du ihn für
delete[]brauchst.Zu dem Buch kann ich mich meinen Vorrednern nur anschließen, wobei ich die
Init()Methode noch als den größten Fauxpas empfinde. Komisch auch, weil Konstruktoren ja offensichtlich schon gelehrt wurden.
-
Okay, viele Dank für die Tipps bezüglich des Buches. Aber mal eine andere Frage, macht es jetzt (noch) Sinn ein neues Buch dafür zu kaufen, oder findet ihr man kann diese Neuheiten auch im Nachhinein ergänzen. Ich habe schon mehr als die Hälfte des Buches durchgearbeitet und deswegen bin ich mit unsicher.
Edit:
-> Danke für die Antwort zum Thema, soweit hab ich das mittlerweile verstanden
. Wie ich schon erwähnt habe ist dieses Buch nach und nach darauf ausgelegt die Grundlagen so einfach wie möglich zu erklären. Ja die Konstruktoren wurden schon davor erklärt, ich denke der Autor wollte nur "New und Delete" auf eine einfache Weise darstellen.
-
Ich persönlich würde mir ein neues Buch besorgen, und evtl. auch wichtige Themen wie Speicherverwaltung nochmals genauer anschauen. Die Gefahr ist gross, dass auch viele andere Themen fragwürdig behandelt werden. Du willst dir keinen schrecklichen C++-Stil zulegen, den du dir anschliessend über Jahre hinweg abgewöhnen musst...
Wichtig ist auch, nicht C++ und Spieleprogrammierung auf einmal lernen zu wollen. Gemischte Bücher sind entsprechend schlecht. C++ ist komplex genug, du wirst beim Spiele Entwickeln genügend Herausforderungen haben und daher froh sein, wenn die Grundlagen gut sitzen und du dich nicht ständig mit der Programmiersprache herumschlagen musst.
-
Gut, dann steht meine Entscheidung soweit fest, ich werde mir im laufe der Tage ein neues Buch zulegen welches noch mal auf die Grundlagen ohne Spieleprogrammierung eingeht. Lieber noch mal alles durch gehen, als mit einem schlechten Stil zu arbeiten.
-
Bezüglich PM: Hab leider momentan nicht allzu viel Zeit, aber frag doch bei Problemen wieder im Forum, hier gibts ab und zu interessante Diskussionen

Durch Mitlesen von (teilweise auch älteren) Threads kann man auch einiges erfahren, ich habe sehr viel über C++ in diesem Forum gelernt.
-
Ah, dachte schon ich habe was falsch gemacht
.Ok dann werde ich das in Zukunft auch so handhaben. Ich bedanke mich!
MfG Fabolous12

-
ich habe sehr viel über C++ in diesem Forum gelernt.
Was meinen Teil angeht, ich habe fast alles über C++ in diesem Forum gelernt.
Gut, nicht ganz alles, ich habe schließlich noch den Standard, Referenzen und die Bücher. Aber das sind gefühlte 5 - 10%.oder findet ihr man kann diese Neuheiten auch im Nachhinein ergänzen.
Ja, das ist sogar gut so. Lerne erstmal die Grundlagen - die sind noch ziemlich unverändert*. range-based for, auto als type-specifier, usw. sind ziemlich einfach und lernt man schnell nebenbei - die Begriffe brauchst du auch noch nicht zu wissen.
*Ich meine hier absolute Grundlagen. Zeiger, Referenzen, Schleifen, If-Statements.