2010-10-13 1 views
5

Hier ist mein Problem:Iterator für Vektor von Zeigern nicht dereferencing richtig

Ich habe ein std::vector<AguiWidgetBase*> die verwendet wird, den Überblick über geordneten Steuerelemente zu halten.

Ich habe diese beiden Funktionen Iteratoren zurück:

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

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

ich es dann wie folgt verwenden:

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

und ich bekomme diese Fehler:

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 

Warum ist es gib mir diese Fehler?

Dank

+0

Wenn Agui wie die meisten anderen GUI-Frameworks funktioniert, sind diese Widgets selbstzerstörerisch. Es wäre dann eine wirklich schlechte Idee, 'shared_ptr' zu verwenden. Aber es hängt vom Agui ab, was auch immer das ist. –

+0

Sie haben Recht, sie sind selbstzerstörerisch – jmasterx

Antwort

4

Gibt es eine Weise, die ich meine Iteratoren ändern kann, so dass it-> funktioniert?

direkt nicht, aber man konnte wie etwas tun:

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

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

Weil ein Iterator wie ein Zeiger wirkt, und in diesem Fall ein Zeiger auf einen Zeiger.

Sie müssen:

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

Gibt es eine Möglichkeit, dass ich meine Iteratoren ändern kann, damit es funktioniert? – jmasterx

+2

Es ist nicht der Iterator. Es ist, weil der Vektor ein Vektor von Zeigern ist. Wenn Sie den Iterator einmal deaktivieren, erhalten Sie einen Zeiger auf eine AguiWidgetBase, die Sie erneut dereferenzieren müssen. – Donnie

+0

Also gibt es keine Möglichkeit es zu bekommen-> zu arbeiten? – jmasterx

0

Wie andere bereits erwähnt haben, ist dies, weil die Objekte in Ihrem Vektor gespeicherten Zeiger sind, so haben Sie eine zusätzliche Dereferenzierungsebene auf die tatsächliche Objekte.

Sie können möglicherweise eine boost::ptr_vector verwenden, um die AguiWidgets per Zeiger zu sammeln, aber mit ihnen arbeiten, als ob sie nach Wert gespeichert sind? Ich habe es nicht ausgiebig benutzt, aber meine vage Erinnerung ist, dass es so funktioniert.