2010-04-15 5 views
1

J'ai un vecteur de pointeurs sur des objets souris appelés 'souris'. Je passe les souris au chat par référence.Problème avec le passage de vecteur de pointeurs vers des objets à la fonction membre d'un autre objet

vector <Mouse*> mice; 
Cat * c; 

c->lookForMouse(&mice); 

Et voici mon lookForMouse() fonction membre

void Cat::lookForMouse(vector <Mouse*> *mice) 
{ 
    ... 
} 

Et maintenant au problème! Dans la fonction ci-dessus, je n'arrive pas à accéder à mes souris. Ce ci-dessous ne fonctionnera pas

mice[i]->isActive(); 

Le message d'erreur que je reçois suggère d'utiliser des souris [i] .isActive(), mais renvoie une erreur en disant isActive() n'est pas membre de std :: vecteur < _Ty> ...

Cela fonctionne bien ...

vector <Mouse*> miceCopy = *mice; 
miceCopy[i]->isActive(); 

Je comprends que je ne devrais pas être en train de créer un autre vecteur de souris ici, il va à l'encontre du point entier de passer par référence (laissez-moi savoir si Je me trompe) ...

Pourquoi je ne peux pas faire des souris [i] -> isActive() Que dois-je faire?

Merci pour votre temps et votre aide: D

James.

+0

Comme on peut le voir à partir de réponses multiples, le titre de cette question n'a rien à voir avec le vecteur de pointeurs, mais plutôt avec la gestion des références de pointeur. –

+0

Oops ... Si je pouvais remonter le temps, Si je pouvais trouver un moyen, je reprends ces mots que vous faire du mal, Et vous restiez, Si je pouvais atteindre les étoiles, je D vous les donner tous, Alors vous m'aimez, aimez-moi, Comme vous le faisiez auparavant ... –

Répondre

4

Le problème est que vous êtes pas passer une référence , mais un pointeur .
Une référence serait passé comme un objet:

c->lookForMouse(mice); 

et la fonction prendre ressemblerait à ceci:

void Cat::lookForMouse(vector <Mouse*> &mice) 

Notez que les conteneurs de pointeurs muets sont sujettes à des fuites. Par exemple:

void f() 
{ 
    std::vector<Mouse*> mice = g(); 
    h(); // throws! 

    cleanup(mice); // deletes objects in vector, is never called if h() throws 
} 
+0

Merci, cela a résolu pour moi!Pouvez-vous élaborer sur ce que vous voulez dire à propos des pointeurs muets ayant tendance à fuir? Je ne comprends pas. –

+0

Si une exception est levée, le destructeur d'un vecteur de pointeurs ne libère que les pointeurs, pas les éléments vers lesquels ils pointent. Vous ferez toutes les choses pointées si elles sont sur le tas. D'autre part, tant que les choses dans le vecteur ont des destructeurs qui nettoient la mémoire (par exemple, des pointeurs intelligents), vous êtes bon. – AshleysBrain

+0

@Kamesz: J'ai ajouté un exemple. – sbi

2

mice[i] indexera le pointeur sur le vecteur. Pour obtenir un élément du vecteur, vous devez d'abord déréférencer le pointeur, donc faire:

(*mice)[i]->isActive() 

Ou peut-être mieux, passer le vecteur comme référence au lieu d'un pointeur.

+0

Cela sonne une cloche. J'essayais de faire cela mais j'avais une syntaxe incorrecte. –

0
(*mice)[i]->isActive(); 
Questions connexes