2010-10-13 37 views
5

Đây là vấn đề của tôi:Iterator cho vector của con trỏ không dereferencing chính xác

Tôi có một std::vector<AguiWidgetBase*> được sử dụng để theo dõi kiểm soát con.

Tôi có hai chức năng này để trở lại vòng lặp:

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

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

sau đó tôi sử dụng nó như thế này:

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

và tôi nhận được các lỗi này:

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 

Tại sao nó cho tôi những lỗi này?

Cảm ơn

+0

Nếu Agui hoạt động giống như hầu hết các khung công tác GUI khác thì các tiện ích đó sẽ tự hủy. Sau đó nó sẽ là một ý tưởng thực sự xấu để sử dụng 'shared_ptr'. Nhưng nó phụ thuộc vào Agui, bất kể đó là gì. –

+0

Bạn đúng, họ tự hủy – jmasterx

Trả lời

4

Có cách nào tôi có thể thay đổi vòng lặp của tôi để nó-> hoạt động?

Không trực tiếp, nhưng bạn có thể làm điều gì đó như:

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

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

Bởi vì một iterator hoạt động như một con trỏ, và trong trường hợp này một con trỏ đến một con trỏ.

Bạn sẽ cần:

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

Có cách nào tôi có thể thay đổi trình lặp của mình để nó hoạt động không? – jmasterx

+2

Nó không phải là trình lặp. Đó là bởi vì vector là một vec tơ của con trỏ. Derefencing các iterator một lần cung cấp cho bạn một con trỏ đến một AguiWidgetBase, mà bạn phải dereference một lần nữa để sử dụng. – Donnie

+0

Vì vậy, không có cách nào để làm cho nó-> để làm việc? – jmasterx

0

Như những người khác đã lưu ý, điều này là do các đối tượng được lưu trữ trong vector của bạn là con trỏ, vì vậy bạn có một cấp thêm gián tiếp đến các đối tượng thực tế.

Bạn có thể sử dụng boost::ptr_vector để thu thập AguiWidgets theo con trỏ nhưng làm việc với chúng như thể chúng được lưu trữ theo giá trị? Tôi đã không sử dụng nó rộng rãi nhưng hồi ức mơ hồ của tôi là nó hoạt động theo cách đó.

Các vấn đề liên quan