2011-06-23 3 views
1

J'ai deux classes, la première qui contient un vecteur et un get méthode comme ceci:vecteur de retour de la fonction

std::vector<mytype> const& MyClassA::getvector(std::vector<mytype>::iterator &it) 
{ 
    it = this->myiterator; 

    return this->myvector; 
} 

std::vector<mytype> myvector; 
std::vector<mytype>::iterator myiterator; 

et j'ai une autre classe où je devrais utiliser le vecteur:

MyClassB::myfunction() 
{ 
    std::vector<mytype>::iterator it; 
    std::vector<mytype> vector = MyClassA->getvector(it); 

    if (it > vector.begin()) 
    { 
     .... 
     (--it)->dosomestuff(); 
     .... 
    } 
} 
Si j'ai une exception d'exécution: les itérateurs sont incompatibles.

Pourquoi?

EDIT 1

void MyClassA::setvector(mytype myelement) 
{ 
    this->myvector.push_back(myelement); 
    this->myiterator = this->myvector.end() - 1; 
} 
+0

Où initialisez vous myiterator? –

+0

@Rocky a ajouté une fonction supplémentaire à la réponse – Stefano

Répondre

10

Vous avez effectué une copie du vecteur dans le code appelant et l'itérateur n'est pas valide car il pointe toujours sur le vecteur d'origine.

Vous avez probablement destiné quelque chose comme ceci:

const std::vector<mytype> & vector = MyClassA->getvector(it); 
+0

@Mark cela fonctionne mais j'ai toujours un problème, je devrais déplacer l'itérateur dans la fonction MyClassB et enregistrer la position actuelle dans la variable d'origine stockée dans la classe MyClassA – Stefano

+0

@Stefano Commuter le paramètre et le résultat. Stockez une copie dans le paramètre et renvoyez le nouvel itérateur. 'newvec.begin() + (olditer-oldvec.begin())' devrait fonctionner. –

+0

@Let j'ai besoin d'un vecteur comme retour de la fonction. Tout fonctionne maintenant mais il n'enregistre pas la nouvelle valeur dans la variable d'itérateur d'origine, MyFunctionB travaille sur une copie d'itérateur – Stefano

1

Depuis votre retour std::vector<mytype> _const_&, le type de son iterator est std::vector::const_iterator.

EDIT:

Ah oui, je me trompe et Mark Ransom est exact. Je laisse cette réponse ici à cause de la discussion dans les commentaires, qui peut être utile à quelqu'un d'autre.

+1

@sehe Vous ne pouvez pas obtenir un itérateur à partir d'un vecteur constant, mais ceci est totalement hors de propos dans ce cas. –

+0

@sehe: @vines est correct, à partir d'un 'const vector &', seules les fonctions membres 'const' seront appelées, ce qui retourne' const_iterator' (pas 'const iterator'). –

+0

@Ben Mais il n'a pas de vecteur const. –