2010-10-13 14 views
5

Ecco il mio problema:Iterator per il vettore di puntatori non dereferenziazione correttamente

Ho un std::vector<AguiWidgetBase*> che viene utilizzato per tenere traccia dei controlli figlio.

ho questi due funzioni per tornare iteratori:

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

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

allora io uso in questo modo:

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

e ottengo questi errori:

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 

perché è dandomi questi errori?

Grazie

+0

Se Agui funziona come la maggior parte degli altri framework GUI, questi widget si auto-distruggono. Sarebbe quindi un'idea davvero male usare 'shared_ptr'. Ma dipende dagli Agui, qualunque cosa sia. –

+0

Hai ragione, sono autodistruggenti – jmasterx

risposta

4

C'è un modo per cambiare le mie iteratori in modo che it-> funziona?

Non

direttamente, ma si potrebbe fare qualcosa di simile:

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

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

Poiché un iteratore agisce come un puntatore, e in questo caso un puntatore a un puntatore .

Avresti bisogno:

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

C'è un modo per cambiare i miei iteratori in modo che esso-> funzioni? – jmasterx

+2

Non è l'iteratore. È perché il vettore è un vettore di puntatori. Disattivando l'iteratore una volta si ottiene un puntatore a un AguiWidgetBase, che è necessario annullare nuovamente. – Donnie

+0

Quindi non c'è modo di ottenerlo-> per funzionare? – jmasterx

0

Come altri hanno notato, questo è perché gli oggetti memorizzati nel vettore sono puntatori, in modo da avere un ulteriore livello di riferimento indiretto al oggetti reali.

Potrebbe essere possibile utilizzare uno boost::ptr_vector per raccogliere AguiWidgets tramite il puntatore, ma lavorare con essi come se fossero memorizzati in base al valore? Non l'ho usato estensivamente, ma il mio vago ricordo è che funziona così.

Problemi correlati