2010-12-08 50 views
1

J'ai une classe où je veux utiliser une grande quantité de vecteurs.itérateurs de vecteurs incompatibles

class Bar { 
    Bar(); 
    std::vector<Foo> * _grid; 
    void someFunction(); 
} 

Bar::Bar() { 
    _grid = (std::vector<Foo> *)malloc(_gridSize * sizeof(std::vector<Foo>); 
    memset(_grid, 0, _gridSize * sizeof(std::vector<Foo>); 
} 

void Bar::someFunction() { 
    int index = 0; 
    std::vector<Foo> someVariable = _grid[index]; 
} 

Cependant, dès que je l'appelle someFunction(), je reçois un message d'erreur vector iterators incompatible dès qu'il ya une teneur en _grid[index]. Si le vecteur est vide, cela fonctionne.

J'ai lu sur le message d'erreur produit par les itérateurs invalidés, cependant, puisque je ne change rien sur les vecteurs à ce stade, je ne comprends pas ce qui ne va pas ici.

+3

Pourquoi dans le monde utilisez-vous 'malloc'? Votre vecteur n'est pas en construction! –

+0

La chose étrange à ce sujet était que push_back etc travaillé et studio visuel correctement l'a montré avec la capacité et la taille ^^. J'ai oublié le constructeur. – Etan

+0

"J'ai une classe où je veux utiliser une grande quantité de vecteurs." Quel montant vous semblez déterminer à l'exécution. Euh ... pourquoi ne pas utiliser un vecteur de vecteurs? Avez-vous en quelque sorte oublié quels vecteurs sont ** pour ** au milieu de leur utilisation? :) –

Répondre

4

Vous ne voulez certainement pas allouer dynamiquement le vecteur; il suffit d'inclure comme membre de la classe:

class Bar { 
    std::vector<Foo> _grid; 
}; 

Si vous voulez vraiment allouer dynamiquement le vecteur, vous voulez utiliser new, qui construit le vecteur. Comme il est écrit maintenant, vous malloc espace pour le vecteur et définir tous les octets occupés par le vecteur à zéro. Vous n'appelez jamais le constructeur std::vector pour l'objet alloué, donc vous ne pouvez pas l'utiliser comme std::vector.

Assurez-vous d'avoir a good introductory C++ book pour apprendre la langue. Si vous ne comprenez pas le modèle de mémoire et le modèle d'objet C++, vous pouvez désormais écrire le code C++ correct.

+0

Eh bien, je veux :-) Depuis l'index dans la grille ne doit pas changer au fil du temps. – Etan

+0

Votre allusion à la prise de "nouveau" a aidé à résoudre mon problème. Merci. – Etan

+0

@Etan: Votre commentaire n'a aucun sens. L'adresse du vecteur ne changera pas tant que l'instance de 'Bar' dont il est membre existe. –