2014-02-11 59 views
3

我有兩個繼承自第三個類的類,它們存儲在一個列表中。迭代繼承類C++的列表

我想迭代該列表並調用每個類的實現函數,但是,代碼不編譯。

這裏是我的代碼:

class A 
{ 
    public: 

    virtual void foo()=0; 
}; 

class B :public class A 
{ 
    public: 

    void foo(); 
} 

class C :public class A 
{ 
    public: 

    void foo(); 
} 

std::list<A*> listOfClasses; 

listOfClasses.push_back (new B()); 
listOfClasses.push_back (new C()); 

for(std::list<A*>::iterator listIter = listOfClasses.begin(); listIter != listOfClasses.end(); listIter++) 
{ 
    listIter->foo() 
} 

此代碼不能編譯,我得到以下錯誤消息(for the line listIter->foo()):

'foo' : is not a member of 'std::_List_iterator<_Mylist>'

任何想法,爲什麼?

+2

嘗試'(* listiter) - > foo()' – Netwave

回答

2

你的容器保存的指針,所以你需要取消引用它們:

(*listIter)->foo(); 
3

您需要解引用迭代器第一:

(*listIter)->foo() 
5

你必須使用迭代器是這樣的:(*listIter)->foo()

+1

這是因爲迭代器就像一個指針,它指向的是一個指針。所以有兩個層次的間接。 –

3

對於某些變體,下面是C++ 11的一個更簡單的替代語法,它完全避免了這個問題:

for (auto p : listOfClasses) 
{ 
    p->foo(); 
} 
+0

+1不錯.......! – Nick