2014-02-11 4 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

try '(* 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

Смежные вопросы