2013-04-18 70 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 *',因爲它只涉及一個對象。 –