Ich arbeite gerade an einem Kartenspiel und habe Probleme mit einem Initialisierungscode:
%Vor% Das Problem ist, dass mein Compiler mir sagt, dass cards++
kein l-Wert ist. Ich habe die ganze Sache mit dem Zeiger-Array-Äquivalenz gelesen, und ich dachte, ich hätte es verstanden, aber leider kann ich es nicht zum Laufen bringen. Mein Verständnis ist, dass, da cards
zu einem Zeiger degradiert, und der Operator new
gibt mir einen Zeiger auf den Speicherort meiner neuen Instanz von Card, dann sollte der obige Code kompilieren. Richtig?
Ich habe auch versucht, einen Index zu verwenden, aber ist nicht cards+i
, cards++
und cards[i]
nur 3 Möglichkeiten, dasselbe zu sagen? Ich dachte, dass jeder von ihnen l-Werte sind und als Zeiger behandelt werden.
cards
ist bereits ein Array von Objekten. Sie werden mit dem Standardkonstruktor konstruiert (Konstruktor ohne Argumente). Sie müssen new
nicht erneut eingeben. Wahrscheinlich benötigen Sie eine Elementfunktion, die Konstruktorargumenten entspricht und über diese zuweisen.
Noch einfacher ist es, std::vector
Der Code Card cards[20];
erstellt bereits ein Array von 20 Card
-Objekten und erstellt diese mit dem Standardkonstruktor. Dies ist möglicherweise nicht das, was Sie mit Ihrem Code erhalten möchten.
Ich würde stattdessen vector
vorschlagen.
Beachten Sie, dass Ihre for
-Schleife von 0
nach 20
und damit nach dem Ende des Arrays geht.
Wenn Sie vermeiden wollen, unnötige Konstruktoraufrufe und unnötige Größenänderung, dann ist es komplizierter, weil C ++ normalerweise jedes Objekt einzeln initialisiert, wie es zugeteilt ist. Eine Problemumgehung besteht darin, die Java-Methode zu verwenden - verwenden Sie eine Schleife und ein Array von Zeigern, wie folgt:
%Vor%Eine weitere Option ist die Verwendung von malloc, um explizit nicht initialisierten Speicher zu erhalten:
%Vor% Ein Array-Name, cards
in Ihrem Code, enthält die Adresse des ersten Elements des Arrays. Solche Adressen werden zur Laufzeit zugewiesen und können nicht geändert werden. Daher beschwert sich der Compiler darüber, dass cards
kein l-Wert ist.
Aber Sie können definitiv angeben, was diese Adressen halten können, indem Sie einen Zeiger wie folgt verwenden:
%Vor%