2009-08-18 11 views
3

Comment puis-je obtenir un tableau de pointeurs pointant vers des objets (classes)?Tableau de pointeurs

Je dois allouer dynamiquement de l'espace pour eux et la longueur de la matrice n'est pas déterminée avant l'exécution. Quelqu'un peut-il expliquer et me dire comment le définir? et peut-être leur expliquer comment cela fonctionne, serait vraiment agréable :)

+0

Pointeurs vers une classe ou des classes spécifiques dérivées d'un parent unique ou de n'importe quelle classe? –

+0

non non, n'importe quelle classe – akif

+0

Les tableaux de longueur variable (VLA) sont une extension de compilateur non standard. Ils ont été ajoutés à la spécification C99 et ne seront jamais ajoutés aux spécifications C++. Ils ne fonctionnent que grâce aux extensions de compilateurs implémentées par intel/gnu/microsoft. Utilisez simplement un vecteur, c'est ce qu'ils sont. –

Répondre

10

Vous pouvez le faire avec un pointeur vers votre classe. Fondamentalement, vous créez un pointeur vers un tableau de références dans la mémoire. La première nouvelle alloue ce tableau. La boucle alloue chaque instance de MyClass dans ce tableau.

Cela devient beaucoup plus facile si vous utilisez std :: vector ou un autre conteneur qui peut croître à volonté, mais ce qui précède fonctionne si vous voulez gérer vous-même la mémoire.

+1

Corrigez-moi si je me trompe (cela fait un moment), mais n'oubliez pas d'appeler delete [] pour le relâcher quand vous aurez fini. –

+0

Je ne pense pas qu'il a montré le code où vous supprimer - en supposant que la durée de vie de la matrice est plus longue qu'un seul appel de fonction. En outre, le redimensionnement est une douleur. D'où la suggestion de classes de collecte de vecteurs/listes. – Kieveli

+0

Dois-je appeler delete si j'utilise des vecteurs?Je vais allouer dynamiquement la mémoire – akif

15

Utilisez plutôt std::vector. Il est conçu pour redimensionner dynamiquement la collection au besoin.

#include <vector> 
// ... 
std::vector<Class*> vec; 
vec.push_back(my_class_ptr); 
Class* ptr = vec[0]; 
+0

merci, je vais regarder dans cela aussi – akif

+2

Un vecteur de pointeurs a encore beaucoup d'occasion de fuite si vous utilisez des algorithmes STL sur le vecteur. Essayez d'utiliser un vecteur d'objets plutôt que des pointeurs lorsque vous le pouvez. – KJAWolf

+1

@KJAWolf: pouvez-vous donner quelques exemples d'un algorithme STL qui provoque une fuite avec 'std :: vector '? –

3

Je ne peux pas encore éditer ou commenter, je dois donc le poster dans une réponse: ce que Reed Copsey a dit, mais avec une solution. Lorsque vous accédez à des éléments de votre tableau de pointeurs dont vous avez besoin pour accéder aux membres comme ceci:

MyClass ** arrayOfMyClass = new MyClass*[arrayLengthAtRuntime]; 
for (int i=0;i<arrayLengthAtRuntime;++i) 
    arrayOfMyClass[i] = new MyClass(); // Create the MyClass here. 

// ... 
arrayOfMyClass[5]->DoSomething(); // Call a method on your 6th element 

J'utilise cette méthode beaucoup à mettre en œuvre mes propres tableaux de taille dynamique (ce std :: vecteur est), surtout parce que je Je n'ai pas inventé ici le syndrome mais aussi parce que j'aime les personnaliser pour mon usage particulier.

+1

Vous avez pas inventé ici syndrome pour 'std :: vector'? : O Si oui, vous devriez vraiment envisager d'écrire un compilateur C++ aussi; et probablement construire votre propre CPU. –

+0

Eh bien c'est en partie parce que j'ai appris à écrire mes propres vecteurs avant d'apprendre l'existence de std :: vector, et maintenant c'est juste habitude;) –

4

Utilisez boost::ptr_vector et les maux de tête oublier tableau et pointeur:

boost::ptr_vector<animal> vec; 
vec.push_back(new animal); 
vec[0].eat(); 

Vous pouvez ajouter des éléments dynamiquement et vous n'avez pas besoin de vous soucier de les supprimer.

+0

Si Boost n'est pas une option (malheureusement, cela semble être le cas arriver à travailler sur le code C++, pour certaines raisons ineptes), mais TR1 est - par exemple vous utilisez une version récente de g ++, ou VC++ 2008 SP1, alors 'std :: vector >' ferait aussi l'affaire. –

Questions connexes