2010-10-13 14 views
5

Voici ma question:Iterator pour le vecteur de pointeurs ne déréférencement correctement

J'ai un std::vector<AguiWidgetBase*> qui est utilisé pour garder une trace des contrôles enfants.

J'ai ces deux fonctions pour retourner itérateurs:

std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildBeginIterator() const 
{ 
    return children.begin(); 
} 

std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildEndIterator() const 
{ 
    return children.end(); 
} 

Je l'utilise alors comme ceci:

for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator(); 
    it != box->getChildEndIterator(); ++it) 
{ 
    it->setText("Hello World"); 
} 

et je reçois ces erreurs:

Error 3 error C2039: 'setText' : is not a member of 'std::_Vector_const_iterator<_Ty,_Alloc>' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112 
Error 2 error C2839: invalid return type 'AguiWidgetBase *const *' for overloaded 'operator ->' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112 

Pourquoi est-il me donner ces erreurs?

Merci

+0

Si Agui fonctionne comme la plupart des autres frameworks GUI, alors ces widgets s'autodétruisent. Ce serait alors une très mauvaise idée d'utiliser 'shared_ptr'. Mais cela dépend de l'Agui, quel qu'il soit. –

+0

Vous avez raison, ils sont auto-destructeurs – jmasterx

Répondre

4

Est-il possible que je peux changer mes itérateurs pour que IT-> fonctionne?

Pas directement, mais vous pouvez faire quelque chose comme:

for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator(); 
    it != box->getChildEndIterator(); ++it) 
{ 
    AguiWidgetBase* p = *it; 

    p->setText("Hello World"); 
} 
23

Comme un itérateur agit comme un pointeur, et dans ce cas, un pointeur à un pointeur.

Vous auriez besoin:

(*it)->setText("Hello World"); // dereference iterator, dereference pointer 
+1

Y a-t-il un moyen de changer mes itérateurs pour qu'ils fonctionnent? – jmasterx

+2

Ce n'est pas l'itérateur. C'est parce que le vecteur est un vecteur de pointeurs. La déferréation de l'itérateur vous donne un pointeur vers un AguiWidgetBase, que vous devez déréférencer à nouveau pour l'utiliser. – Donnie

+0

Il n'y a donc aucun moyen de le faire fonctionner? – jmasterx

0

Comme d'autres l'ont noté, c'est parce que les objets stockés dans votre vecteur sont des pointeurs, vous avez un niveau d'indirection supplémentaire à la objets réels.

Vous pouvez utiliser un boost::ptr_vector pour collecter les AguiWidgets par pointeur, mais travailler avec eux comme s'ils étaient stockés en valeur? Je ne l'ai pas beaucoup utilisé, mais mon vague souvenir est que cela fonctionne de cette façon.