C++ 无法将列表迭代器强制转换为对象
我得到一个错误:C++ 无法将列表迭代器强制转换为对象,c++,C++,我得到一个错误: error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *' 错误C2682:无法使用'dynamic_cast'将'std::_List_iterator'转换为'UserBean*' 执行时: list<UserBean> * userBeans = getUserBeans(); for(list<
error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *'
错误C2682:无法使用'dynamic_cast'将'std::_List_iterator'转换为'UserBean*'
执行时:
list<UserBean> * userBeans = getUserBeans();
for(list<UserBean>::iterator i = userBeans->begin(); i != userBeans->end(); i++)
UserBean * newUser = dynamic_cast<UserBean*>(i);
list*userBeans=getUserBeans();
对于(列表::迭代器i=userBeans->begin();i!=userBeans->end();i++)
UserBean*newUser=dynamic\u cast(i);
我做错了什么,或者您不能将迭代器项转换为对象吗?您不能将迭代器转换为这样的指针-这不是
dynamic\u cast
的用途。只有在处理多态行为(如果有的话)时,才应该使用dynamic\u cast
。但是,您可以这样做:
UserBean* newUser = &*i;
这将取消对迭代器的引用以获取对象,然后获取对象的地址。容器的类型是
list
而不是list
这就是迭代器错误的原因。它的类型是UserBean
。不是UserBean*
UserBean userBean = *i;
或
我做错了什么,或者您不能将迭代器项转换为对象吗
不,你不能。您可以取消引用迭代器以访问对象:
UserBean & newUser = *i;
有时迭代器被实现为指向容器项的原始指针,但更多的时候,它们根本不是指针,所以不要这样对待它们。访问迭代器引用的项的正确方法是取消对迭代器的引用,例如:
UserBean &newUser = *i;
或:
迭代器通常重写->
运算符,以便在迭代器引用实际对象实例(您的实例)而不是指向对象实例的指针的情况下,您可以访问引用项的成员,例如:
i->SomeMemberHere
是的,在这里使用
UserBean&
比使用UserBean*
更好,因为它只引用一个对象。即使列表中确实包含指针(可能不应该包含指针),您仍然需要取消对迭代器的引用,而不是执行一些奇怪的强制转换。“您容器的输入错误”-喜欢它@史蒂芬尼罗兰:对不起,在你添加关于取消引用的部分之前,我写了评论。但是我其余的评论——指针和容器很少能很好地混合。但是你为什么这么说呢?我在C++中已经使用指针容器多年了?他的列表不是指针列表,而是对象列表!哦,你是说如果OP对UserBean使用多态性,那么他就会成为对象切片的受害者。。。所以你的意思是“容器和对象”很少能很好地混合。是这样吗?在java中就是这样。UserBean user=(UserBean)迭代器.next();类似的东西,也许在C++中也是如此!
UserBean *newUser = &(*i);
i->SomeMemberHere