2010-06-11 3 views
0

Vous cherchez de l'aide avec des tableaux et des pointeurs et des explications sur ce que j'essaie de faire. Je veux créer un nouveau tableau sur le tas de type Foo * afin que je puisse attribuer plus tard des objets qui ont été créés ailleurs à ce tableau. J'ai de la difficulté à comprendre ce que je crée exactement quand je fais quelque chose comme ce qui suit.Arrays & Pointers

Foo *(*f) = new Foo*[10]; 

Une fois que j'ai créé mon tableau, comment puis-je accéder à chaque élément par exemple.

(f + 9)->fooMember(); ?????? 

Merci d'avance.

Répondre

3
Foo *(*f) = new Foo*[10]; 

Les parenthèses dans la déclaration ne sont pas nécessaires, c'est donc le même que:

Foo **f = new Foo*[10]; 

Dans tous les cas, l'espace pour new Foo*[10] alloue dix Foo* s et les feuilles non initialisée. Il renvoie un pointeur vers le Foo* initial dans le tableau (l'élément zeroth), que vous affectez à f.

Pour accéder à des éléments du tableau, utilisez simplement subscripting:

f[0] = new Foo; 
f[0]->fooMember(); 

Rappelez-vous que tout ce que vous créez à l'aide new[] doit être libéré une fois lorsque vous avez terminé avec elle en appelant delete[] sur le pointeur. Par exemple:

delete[] f; 

Cela ne pas supprimer les éléments pointés par les Foo* s dans le tableau. Si vous créez Foo objets en utilisant new, vous devez delete les avant vous supprimez le tableau.Par exemple, pour libérer l'élément que nous avons créé ci-dessus:

delete f[0]; 
+0

Merci. Si je voulais accéder aux éléments individuels sans utiliser l'opérateur [] mais avec l'arithmétique du pointeur, à quoi cela ressemblerait-il? – Thomas

+0

@Thomas: 'f [0]' est juste un raccourci pour '* (f + 0)', donc par exemple, vous pouvez faire '(* (f + 0)) -> fooMember()'. –

+0

Merci. Quel est le roulement des premières parenthèses *? – Thomas

1

Vous pouvez créer un tableau de pointeurs en utilisant le code suivant:

Foo** f = new Foo*[10]; 

accéder ensuite les éléments avec:

f[9]->fooMember(); 

Assurez-vous de nettoyer après:

delete[] f; 

Merci.

+0

Tout correct, mais je manque un commentaire sur le fait que si ces trois lignes sont collées ensemble dans un programme sans code supplémentaire du système sera probablement mourir (car aucun objet 'Foo' n'a été créé) –

1

Lorsque vous avez cette situation, vous pourriez trouver l'extrait de code suivant utile:

d'abord l'initialisation:

Foo** f = new Foo*[10]; 
for (int i = 0; i < 10; i++) { 
    f[i] = new Foo; 
} 

Puis accède à chaque élément du tableau f qui est ce que vous avez demandé, mais vous ne pourrez pas le faire à moins d'allouer de la mémoire correctement pour chaque membre en appelant le constructeur comme ci-dessus:

f[9]->fooMember(); 

Enfin, pour garder les choses en ordre et pour éviter les fuites de mémoire:

for (int i = 0; i < 10; i++) { 
    delete f[i]; 
} 
delete[] f; 
+0

Vous devriez utiliser 'std :: for_each' sur des boucles écrites explicitement. –

+1

@Billy ONeal - C'est en supposant que vous allez utiliser STL. Certes, c'est presque toujours vrai, mais c'est une hypothèse. La boucle for est toujours légale et valide en C++. –

+0

@Khnle: Vrai. Cependant, juste parce que quelque chose est possible ou valide ne signifie pas que c'est la meilleure méthode pour accomplir des choses. Les appels d'algorithme sont toujours meilleurs que les boucles explicites. –

1

Les tableaux et les pointeurs ne sont pas très C++ ish. Que diriez-vous

std::vector<std::shared_ptr<Foo> > f; 
f.push_back(std::make_shared<Foo>(whatever, arguments, you, need)); 
// ... 
f[9]->fooMember(); 
// ... 

Aucun nettoyage manuel nécessaire :-)

+0

Sauf bien sûr que shared_ptr ne fait pas encore partie de la norme C++. –

+0

@Neil Oui, mais j'espère que tous les programmeurs compétents sont assez intelligents pour google 'shared_ptr' et trouver une solution. Si 'std :: shared_ptr' ne fonctionne pas,' std :: tr1 :: shared_ptr' ou 'boost :: shared_ptr' devrait faire l'affaire :) – fredoverflow