2010-10-13 15 views
5

Oto mój problem:Iterator dla wektora wskaźników nie dereferencing poprawnie

mam std::vector<AguiWidgetBase*> który jest używany do śledzenia kontroli potomnych.

mam te dwie funkcje, aby powrócić iteratorów:

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

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

I następnie używać go tak:

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

i otrzymuję te błędy:

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 

Dlaczego jest to podając mi te błędy?

Dzięki

+0

Jeśli Agui działa tak, jak większość innych frameworków GUI, to te widgety same się niszczą. Byłby to naprawdę zły pomysł, aby użyć 'shared_ptr'. Ale to zależy od Agui, cokolwiek to jest. –

+0

Masz rację, one same się niszczą – jmasterx

Odpowiedz

4

Czy istnieje sposób mogę zmienić moje iteratory tak że it-> działa?

Nie bezpośrednio, ale można zrobić coś takiego:

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

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

Ponieważ iterator działa jak wskaźnik, a w tym przypadku wskaźnik do wskaźnika.

należałoby:

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

Czy istnieje sposób, w jaki mogę zmienić moje iteratory, aby działały? – jmasterx

+2

To nie jest iterator. To dlatego, że wektor jest wektorem wskaźników. Wyodrębnianie iteratora daje ci jeden wskaźnik do AguiWidgetBase, którego musisz użyć ponownie. – Donnie

+0

Więc nie ma sposobu, aby go uzyskać-> do pracy? – jmasterx

0

jak inni to zauważyli, to dlatego, że obiekty zapisane w wektorze są wskaźnikami, więc trzeba dodatkowy poziom zadnie do rzeczywiste obiekty.

Być może będziesz w stanie użyć narzędzia boost::ptr_vector do zbierania AguiWidget według wskaźnika, ale pracować z nimi tak, jakby były przechowywane według wartości? Nie używałem tego zbyt szeroko, ale moje niejasne wspomnienie jest takie, że działa w ten sposób.