Metoda klasy jako funkcja do for_each

0

Witam,

Mam banalny problem, z którym się męczę od paru godzin. Oczywiście wiem jak obejść ten sposób, ale koniecznie chcę się dowiedzieć jak używać for_each do różnych celów. Otóż mam mam kontener vector obiektów klasy "Student", w której występuje metoda:

void show(){
        cout << "Imie i nazwisko: " << get_name() << endl;
        cout << "Nr albumu: " << get_index() << endl;
    } 

Następnie chcę zastosować funkcję nam dostępną for_each:

 void showStudents(vector <Student> s){
   for_each(s.begin(),s.end(),show);
}

Problem polega na tym, że wywala błąd. Domyślam się, że powodem jest to, iż ostatnim argumentem funkcji for_each jest wskaźnik na funkcję, a nie metodę klasy. Poradziłem sobie w ten sposób:

 void showStud(Student& s){
    s.show();
}
void showStudents(vector <Student> s){
   for_each(s.begin(),s.end(),showStud);
}

Natomiast wiem, że to bez sensu. Mogę przecież zrobić tak:

void showStudents(vector <Student> s){
    unsigned int i;
    for(i=0;i<s.size();i++) s[i].show();
} 

I załatwione. O jedną funkcję mniej. Lecz bardzo chciałbym użyć funkcji, którą daje nam biblioteka STL.

Z góry dziękuje i pozdrawiam :)

0

Show musi przyjmowac studenta, bo zza pazuchy zadnego nie wyciagnie.

0

Przecież właśnie jej użyłeś

  void showStud(Student& s){
    s.show();
}
void showStudents(vector <Student> s){
   for_each(s.begin(),s.end(),showStud);
}

Możesz też użyć lambdy jeśli tak bardzo nie lubisz dodatkowej funkcji zaśmiecającej namespace:

 
void showStudents(vector <Student> s){
   for_each(s.begin(),s.end(), [](Student& s) { s.show(); });
}
0

Dziękuje wam za odpowiedź. Po prostu zamiast metody napisałem funkcję poza klasą z argumentem jako obiekt tej klasy. No i działa, lecz na początku chciałem, aby podobna funkcja była koniecznie metodą. Taki mój widzimiś. Natomiast wszystko już działa jak należy. Jeszcze raz dziękuje :)

2

Natomiast, jeśli nie chcesz definiować osobnej funkcji, a lambda nie jest dla Ciebie zbyt czytelna to możesz spróbować tak:

void showStudents(std::vector<Student>& students)
{
	std::for_each(students.begin(), students.end(), std::mem_fn(&Student::show));
}

możesz bez problemu również przekazać kontener vector do funkcji, jako const. Wystarczy, że opatrzysz trzy funkcje składowe klasy Student get_name(), get_index(), show() przydomkiem const, a wtedy tę funkcję możesz napisać tak:

void showStudents(const std::vector<Student>& students)
{
	std::for_each(students.cbegin(), students.cend(), std::mem_fn(&Student::show));
}

dodatkowo staraj się przekazywać kontenery do funkcji przez referencję & (unikniesz wtedy niepotrzebnego kopiowania elementów).

1 użytkowników online, w tym zalogowanych: 0, gości: 1