L'initialisation d'un tableau d'objets
Je suis actuellement en train de travailler sur un jeu de carte, et je vais avoir des problèmes avec un code d'initialisation:
//in my class...
Card cards[20];
//in method...
for(int i = 0; i <= 20;i++)
cards++ = new Card(i, /*i as char +*/ "_Card.bmp");
Le problème, c'est que mon compilateur me dit que cards++
n'est pas une l-value. J'ai lu sur l'ensemble du pointeur de tableau d'équivalence chose, et j'ai pensé que je l'ai compris, mais hélas, je ne peux pas le faire fonctionner. Ma compréhension est que, depuis cards
se dégrade à un pointeur, et le new
opérateur me donne un pointeur vers l'emplacement de ma nouvelle instance de la Carte, puis le code ci-dessus devrait compiler. Droit?
J'ai essayé à l'aide d'un indice, mais n'est pas cards+i
, cards++
, et cards[i]
seulement 3 façons de dire la même chose? J'ai pensé que chacun de ceux qui étaient l-valeurs et sont traités comme des pointeurs.
OriginalL'auteur Stephen Collins | 2011-09-26
Vous devez vous connecter pour publier un commentaire.
cards
est déjà un tableau d'objets. Ils sont construits avec le constructeur par défaut(constructeur sans arguments). Il n'est pas nécessaire denew
de nouveau. Probablement vous avez besoin d'un membre de la fonction équivalente à des arguments du constructeur et de l'assigner à travers elle.Même plus simple est d'utiliser
std::vector
Je vous souhaite utiliser std::vector et maintenant le numéro de l'élément à ajouter, N'UTILISEZ PAS push_back: La charge est petite, mais évitables. Vous devez les initialiser le vecteur à la bonne taille 'std::vector<Carte - > les cartes(20);" et puis initialiser les membres de la même manière que pour le Tableau.
OriginalL'auteur Mahesh
Le code
Card cards[20];
déjà crée un tableau de 20Card
objets et crée avec le constructeur par défaut. Cela peut ne pas être ce que vous voulez, compte tenu de votre code.Je conseille
vector
à la place.Noter que votre
for
boucle va de0
à20
et donc on a passé la fin du tableau.OriginalL'auteur Mark B
Si vous voulez éviter le constructeur appelle et inutile de redimensionnement, puis c'est plus compliqué, parce que le C++ normalement initialise chaque objet un par un, comme il est alloué. Une solution de contournement consiste à faire la Java -- utiliser une boucle et un tableau de pointeurs, comme suit:
Une autre option est d'utiliser malloc pour obtenir explicitement à la mémoire non initialisée:
OriginalL'auteur
Un nom de tableau,
cards
dans votre code, contient le adresse du premier élément du tableau. Ces adresses sont attribuées au moment de l'exécution et vous ne pouvez pas les modifier. Donc le compilateur se plaindrecards
n'étant pas une l-value.Mais vous pouvez certainement préciser que ces adresses peuvent tenir à l'aide d'un pointeur comme ci-dessous:
OriginalL'auteur Vaishak Nair
Bien, il y a une autre possibilité, si vous êtes ok avec votre constructeur appelé automatiquement lors de l'initialisation:
L'énorme inconvénient est que vous ne pouvez pas utiliser une boucle dans ce cas.
OriginalL'auteur Iziminza