Initialisierung eines Arrays von Objekten

8

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.

    
Stephen Collins 26.09.2011, 16:22
quelle

4 Antworten

15
%Vor%

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.

%Vor%

Noch einfacher ist es, std::vector

zu verwenden %Vor%     
Mahesh 26.09.2011 16:40
quelle
3

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.

%Vor%

Beachten Sie, dass Ihre for -Schleife von 0 nach 20 und damit nach dem Ende des Arrays geht.

    
Mark B 26.09.2011 16:44
quelle
0

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%     
user833771 24.03.2017 10:21
quelle
0

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%     
Vaishak Nair 14.03.2018 07:16
quelle

Tags und Links