2010-09-14 19 views
0

J'ai besoin d'instancier un objet et de l'ajouter à un tableau. Voilà ce que j'ai actuellement dans une méthode:C++ Ajouter un objet à un tableau

Row r; 
rows[count] = r; 

Le problème est r est ici sur la pile et étant retirée après la sortie de fonction. Je corrige rapidement est de faire r statique mais c'est mauvais non? Que devrais-je faire? (Désolé, complétez C++ noob). Editer: Supprimer le déconstructeur pour Row résout le problème.

+0

Avez-vous de nouveaux/supprimer dans votre classe? – Anycorn

+0

Le déconstructeur pour Row supprime le tableau et c'est ce qui cause le problème. Essayer d'ajouter quelque chose à un tableau qui a été libéré. – Louis

+0

Pourriez-vous également décrire le symptôme de ce problème? Il est possible que vous ayez mal diagnostiqué sa cause. (Ceci est facile à faire avec C++!) –

Répondre

7

La ligne rows[count] = rcopies l'objet r à l'élément à l'index count dans le tableau. Après cela, peu importe ce qui arrive à r, le tableau n'est pas affecté.

[Edit:. OK, il importe indirectement ce qui se passe à r - puisque la copie utilise quelque chose qui peut r supprimer]

Cela est surprenant si vous êtes habitué (par exemple) Java, où un L'élément de tableau n'est pas réellement un objet, c'est juste une référence à un.

+0

Mais cela ne fonctionne pas de la manière actuelle. Ajouter de l'électricité statique: S – Louis

+2

Qu'est-ce qui ne fonctionne pas? Est-ce que la classe 'Row' libère quoi que ce soit dans son destructeur, et si oui, a-t-il un' operator = 'qui copie quoi que ce soit? –

+0

Oui Row libère un tableau qu'il contient et il n'y a pas d'opérateur =. – Louis

0

Dans ce cas, vous le créez dans la pile, puis copiez l'objet dans les lignes d'emplacement [nombre]. Notez que si vous avez créé des lignes en tant que tableau d'objets Row, il y avait déjà un objet Row à cet emplacement, créé avec le constructeur par défaut, que vous avez copié.

Pour diverses raisons, en C++, nous essayons d'utiliser les conteneurs de bibliothèque standard tels que std :: vector et std :: list. Ceux-ci s'étendront pour gérer les nouveaux éléments que vous ajoutez.

3

Utilisation std::vector au lieu du tableau, la construction prévue d' n'est pas difficile:

std::vector<Row> rows; 

Row r; 
rows.push_back(r); 

Lorsque le vecteur est hors de portée, le destructor ~Row() sera appelé pour chaque entrée.

Vous pouvez accéder à la dernière entrée ajoutée en utilisant soit

const Row& last = rows.back(); 

ou

size_t count = rows.size(); 
const Row& last = rows[count - 1];