2010-03-09 2 views
0

En C++, est-ce une bonne idée d'utiliser un vecteur d'objets? Si non, quel est le problème avec ce code C++?C++, vecteur d'objets

#include <vector> 

using namespace std; 

class A {}; 

int main() { 

     vector<A*> v (new A); 
     return 0; 
} 

de g ++:

13: error: invalid conversion from A*' to unsigned int'

Répondre

11

Le constructor for std::vector prend une longueur initiale, et non un élément.

Cela signifie que vous auriez normalement faire:

vector<A*> v(1); // Initialize to length 1 
v.push_back(new A()); // Add your element... 

Vous obtenez l'erreur du compilateur que vous êtes parce que, sur votre système, size_type est défini comme un unsigned int. Il essaye d'utiliser ce constructeur, mais échoue, puisque vous le passez un pointeur vers un A.

4

Vous devez lire le documentation avant d'utiliser quelque chose que vous ne connaissez pas.

Voici les différents constructeurs pour la classe std::vector:

explicit vector (const Allocator& = Allocator()); 
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 
template <class InputIterator> 
     vector (InputIterator first, InputIterator last, const Allocator& = Allocator()); 
vector (const vector<T,Allocator>& x); 
2

Vector n'a pas un constructeur qui prend un élément pour stocker.

Pour faire un vecteur d'un élément avec la valeur donnée:

vector<A*> v (1, new A); 

Quant à savoir si c'est une bonne idée d'avoir un vecteur de pointeurs à objets alloués dynamiquement - pas. Vous devez gérer cette mémoire manuellement.

Il est préférable de stocker des objets par valeur ou si vous devez utiliser un pointeur intelligent pour automatiser la gestion de la mémoire (par exemple, std :: tr1 :: shared_ptr).

1

Je recommande de ne pas utiliser std::vector comme ceci: la gestion de la mémoire devient un cauchemar. (Par exemple, vector<A*> v (10, new A); a dix pointeurs mais un seul objet alloué, et vous devez vous rappeler de ne libérer qu'une seule fois.Si vous ne libérez pas du tout, vous n'avez pas de mémoire.)

Au lieu de cela, pensez à utiliser le Boost Pointer Container library: vous pouvez passer dans les nouveaux objets alloués, et il va gérer toute la gestion de la mémoire pour vous.