Nie umiem <list> i iteratorów :)

0

Aktualnie trenuje listy, i niestety nie umiem za dużo z nimi zrobić. Zatrzymałem się, gdy chciałem zamienić typ na klasę.
Mój kod:

#include <iostream>
#include <list>

using namespace std;

class Klasa {
public:
    int liczba;
    std::string slownie;
 Klasa(int licz, std::string slown) : liczba(licz), slownie(slown) {};

 void test(){ std::cout << slownie;}

};

int main()
{
    list<Klasa> lista;
    lista.push_back(Klasa(1,"jeden"));
    lista.push_back(Klasa(2, "dwa")); 

    for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )
    {
       // std::cout<<*iter<<endl; // BOOM!!
       // **NIE WIEM CO TUTAJ ..**
       // JAK wyświetlić Klasa.slownie? 
       // Jak wywołać Klasa::test?
    }
}
2

Co tutaj? Wystarczy zrobić taki myk:

for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )
{
       iter -> test() ;
}

Czyli odwołujesz się do obiektów klasy z poziomu wskaźnika / iteratora przy pomocy operatora ->.

0

@Lord Darkstorm
(*iter).test()
FTFY :)

Do autora wątku: do kodu dołącz <string> jeszcze.

6
for( list<Klasa>::iterator iter=lista.begin(); iter != lista.end(); iter++ )

A po co tak teraz pisać?

Nie ładniej tak?

for(auto it = begin(lista), e = end(lista); it != e; ++it){
    cout << it->slownie << ", ";
}

Albo jeszcze wygodniej:

for(Klasa const& k : lista){
    cout << k.slownie << ", ";
}

Przy okazji: staraj się używać preinkrementacji (++it zamiast it++) jeśli to możliwe. Unikasz wtedy tworzenia zbędnych kopii, których kompilator nie zawsze może uniknąć.

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