2013-04-18 42 views
2

我得到的错误:无法施展列表迭代器对象

error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *' 

当执行:

list<UserBean> * userBeans = getUserBeans(); 

for(list<UserBean>::iterator i = userBeans->begin(); i != userBeans->end(); i++) 
    UserBean * newUser = dynamic_cast<UserBean*>(i); 

难道我做错了什么,或者你能不能迭代项转换为对象?

+0

在Java中它会。 UserBean user =(UserBean)iterator.next();也许在C++中也有类似的东西! – NINCOMPOOP

回答

11

有时候,迭代器被实现为原料指向容器项目,但更多的时候不是,他们不是指针可言,所以不要把他们的方式。访问项目的正确方式,迭代指的是取消引用迭代器,如:

UserBean &newUser = *i; 

或者:

UserBean *newUser = &(*i); 

迭代器通常覆盖->运营商,所以你可以访问的成员在迭代器引用实际对象实例(属于您的实例)而不是指向对象实例的指针的情况下,引用的项目,例如:

i->SomeMemberHere 
2

您不能将迭代器转换为像这样的指针 - 这不是dynamic_cast的用途。当你处理多态行为时(如果有的话),你应该只使用dynamic_cast。你可以,但是,做它像这样:

UserBean* newUser = &*i; 

这解引用迭代器来获取对象,然后取对象的地址。

0

类型的容器是list<UserBean>list<*UserBean>

这就是为什么你的迭代器是错误的。它的类型是UserBean。不是UserBean*

UserBean userBean = *i; 

UserBean& userBean = *i; 
+0

即使列表确实包含指针(这可能不应该),您仍然需要取消引用迭代器,而不是进行一些奇怪的转换。 –

+0

“你的容器的错字” - 爱它! –

+0

@StephaneRolland:对不起,我在添加关于解引用的部分之前写了评论。但是我的评论的其余部分 - 指针和容器很少混合。 –

4

Am I doing something wrong, or can you not convert iterator items to objects?

不,你不能。你可以提领迭代器来访问对象:

UserBean & newUser = *i; 
+0

是的,最好使用'UserBean&'而不是'UserBean *',因为它只涉及一个对象。 –