Ответ 1
Используйте этот метод:
(*listMyClassIter)->PrintMeOut();
Если у меня есть список,
typedef std::list<MyClass *> listMyClass;
Как выполнить итерацию через них и перейти к методам в этом классе?
Это то, что Ive пытался, но это не так: (MyClass:: PrintMeOut() является общедоступным методом)
for(
listMyClass::iterator listMyClassIter = listMyClass.begin();
listMyClassIter != listMyClass.end();
listMyClassIter ++)
{
listMyClassIter->PrintMeOut();
}
Используйте этот метод:
(*listMyClassIter)->PrintMeOut();
for_each и указатель функции:
std::for_each( listMyClass.begin(),
listMyClass.end(),
std::mem_fun(&MyClass::PrintMeOut)
);
Я предпочитаю использовать конструкцию for_each(), а не писать собственный цикл. Это заставляет его выглядеть аккуратно и делает все, что мне в противном случае понадобится для дополнительного кода.
typedef std::list<MyClass*> listMyClass;
listMyClass instance; // instance, you shouldn't use type in the following loop
for( listMyClass::iterator listMyClassIter = instance.begin(); // not listMyClass.begin()
listMyClassIter != instance.end(); // not listMyClass.end()
listMyClassIter ++)
{
(*listMyClassIter)->PrintMeOut();
}
std:: for_each in невероятно хорошо подходит для этого, некоторые компиляторы теперь собирают lambdas из С++ 0x, что делает его еще более интуитивно понятным.
typedef std::list<MyClass*> MyClassList;
MyClassList l;
for_each(l.begin(),l.end(),[](MyClass* cur)
{
cur->PrintMeOut();
});
for_each (и остальные алгоритмы) помогают скрыть абстракцию между итераторами и типами. Также обратите внимание, что теперь у меня есть эта маленькая крошечная лямбда-функция (или она может быть функтором тоже), которая является более проверяемой, макетируемой, заменяемой и т.д.
Если я вернусь к использованию lambdas, я смогу построить подставку по методу для этого, что можно проверить:
void PrintMyClass(MyClass* cur)
{
cur->PrintMeOut();
}
и теперь код for_each выглядит следующим образом:
typedef std::list<MyClass*> MyClassList;
MyClassList l;
for_each(l.begin(),l.end(),&PrintMyClass);