C++ stl list problem z wyszukiwaniem.

0

Witam. Mam problem z przeszukiwaniem listy zawierającej klasy, a dokładnie z funkcją szukaj_zawodnika. A oto co napisałem:
baza.h

#ifndef BAZA_H
#define BAZA_h
#include <list>
#include "zawodnicy.h"
#include "tor.h"
#include "zawody.h
class Baza
{
	list<Zawodnik_Elita> lista_elita;
	list<Zawodnik_Junior> lista_junior;
	list<Zawodnik_Open> lista_open;
	list<Tor> lista_tor;
	list<class Zawody> lista_zawody;

	public:
		Baza(){};
		Baza(const Baza &b){};

    int lista_elita_size()
	{
		return lista_elita.size();
	}

	int szukaj_zawodnika(int id,int opt)
	{
		list<Zawodnik_Elita>::iterator iter_elita;
		list<Zawodnik_Junior>::iterator iter_junior;
		list<Zawodnik_Open>::iterator iter_open;
		switch(opt)
		{
		 case 0:
			for(iter_elita=lista_elita.begin(); iter_elita != lista_elita.end(); iter_elita++)
			{
				if((*iter_elita).id_zawodnika==id) 
				return 1;
			}
		break;
		
		case 1:
			for(iter_junior=lista_junior.begin(); iter_junior != lista_junior.end(); iter_junior++)
			{
				if((*iter_junior).id_zawodnika==id) return 1;
			}
		break;
		
		case 2:
			for(iter_open=lista_open.begin(); iter_open != lista_open.end(); iter_open++)
			{
				if((*iter_open).id_zawodnika==id) return 1;
			}
		break;
		}
		return 0;
	} 
#endif

A oto plik zawierający klasę zawodnik.
zawodnik.h

 #ifndef ZAWODNICY_H
#define ZAWODNICY_H
#include <iostream>
#include <string>

using namespace std;

class Zawodnik
{
	public:
	int id_zawodnika;
	string imie;
	string nazwisko;
	string pesel;

	public:
	Zawodnik(int id,string _imie,string _nazwisko,string,_pesel):id_zawodnika(id),imie(_imie),nazwisko(_nazwisko),pesel(_pesel)
	{
	};

	Zawodnik(const Zawodnik &_zawodnik):id_zawodnika(_zawodnik.id_zawodnika),imie(_zawodnik.imie),nazwisko(_zawodnik.nazwisko),pesel(_zawodnik.pesel){};

	friend ostream &operator <<(ostream & s,const Zawodnik &z)
	{
		s<<z.imie<<"\n"<<z.nazwisko<<"\n"<<z.pesel<<"\n\n";
		return s;
	};

	virtual int zmien_dane(){return 0;};
};

//***********************************Zawodnik_elita***********************************
class Zawodnik_Elita: public Zawodnik
{
	private:
	int nr_licencji; //numer licencji
	int nr_dowodu;

	public:
	Zawodnik_Elita(int id,string _imie,string _nazwisko,string _pesel,int _nr_lic,int _nr_dowodu):Zawodnik(id,_imie,_nazwisko,_pesel),nr_licencji(_nr_lic),nr_dowodu(_nr_dowodu)
	{
	};

	Zawodnik_Elita(const Zawodnik_Elita & zawodnik):Zawodnik(zawodnik.id_zawodnika,zawodnik.imie,zawodnik.nazwisko,zawodnik.pesel),nr_licencji(zawodnik.nr_licencji),nr_dowodu(zawodnik.nr_dowodu)
	{
	};

	friend ostream &operator <<(ostream & s,const Zawodnik_Elita &z)
	{
		s<<z.imie<<"\n"<<z.nazwisko<<"\n"<<z.pesel<<"\n"<<z.nr_licencji<<"\n"<<z.nr_dowodu<<"\n\n";
		return s;
	};

	int operator==(int id)
	{
		if (this->id_zawodnika !=id) return 0;
		return 1;
	}

	int zmien_dane(){return 0;};

	int GetId()
	{
		return this->id_zawodnika;
	};
};
#endif

I jeszcze się zastanawiam czy nie lepiej by było przechowywać wszystkich zawodników w jednej liście, ale wtedy muszę przechowywać wskaźniki na klasę Zawodnik i za pomocą RTTI mogę rozpoznawać z jakiej klasy dokładnie jest dany zawodnik? I jeszcze nie wiem dlaczego przy klasie Zawody muszę użyć przedrostka 'class' przy innych klasach się o to kompilator nie czepia.

0

nie lepiej użyć mapy?

0

Chodzi o to że jak wywołuje funkcję szukaj_zawodnika to nigdy nie znajduje zawodnika nawet jak istnieje.

0

Nie wiem czy to ważne, ale

class Baza

nie ma domykającego nawiasu klamrowego wraz z średnikiem };

.
0
cichociemny napisał(a):

Nie wiem czy to ważne, ale

class Baza

nie ma domykającego nawiasu klamrowego wraz z średnikiem };

.
Ma , tylko przy kopiowaniu gdzieś się zapodziało :D
0

Wojtala6, a jak dodajesz tych zawodników i jak wywołujesz metodę szukaj_zawodnika? Proszę, zapodaj testowy kod.

0
  1. Dziedziczenie. Switch ... case w funkcji szukaj_zawodnika jest evil w C++.
  2. Zaimplementuj operator== w klasie Zawodnik ( i pochodnych ). Każ obiektom "się porównywać" zamiast zbędnie zaprzyjaźniać klasy.
0
#include <iostream>
#include "zawodnicy.h"
#include "Lista.h"
#include "tor.h"
#include "zawody.h"
#include <list>

using namespace std;

int main()
{
	Baza baza1;

	Zawodnik zaw(1,"wojtek","kowalski","91101811819");
	cout<<lol;

	Zawodnik_Elita zaw1(2,"artur","kowalski","9010121416",2,3);
	cout<<zaw1;

	Zawodnik_Elita zaw2(zaw1);
	cout<<zaw2;

	Zawodnik_Elita zaw3(3,"artur","kowalski","9010121416",2,3);

	Tor tor1("Wisniowiec",1250,160,1);
	Tor tor2(tor1);
	
	cout<<tor1;
	cout<<tor2;

	Data data1(12,5,2012);
	
	Zawody zawody1(1,1,data1,0);

	baza1.dodaj_zawody(zawody1);

	baza1.dodaj_zawodnika(zaw1);
	baza1.dodaj_zawodnika(zaw2);
	baza1.dodaj_zawodnika(zaw3);

	zawody1.dodaj_uzytkownika(2,baza1);
	zawody1.dodaj_uzytkownika(3,baza1);
	
	zawody1.wypisz(baza1);

	cout<<baza1.lista_elita_size()<<"\n";

system("PAUSE");
} 

Dobra napisałem ten operator ale też jakoś nie działa.

		int operator==(int id)
	{
		if (this->id_zawodnika !=id) return 0;
		return 1;
	}; 
0

A teraz jak porownywac probujesz? Jedynym sposobem ktory bedzie dzialac jesli sie nie myle to

zaw1==zaw2.getID

0

@wojtala6:
Operator ten ma wyglądać tak:

class Zawodnik { 
/* .... */ 
public: 
   bool operator==(Zawodnik const& z) const { 
       return this->id_zawodnika == z.id_zawodnika; 
   } 

/* ... */ 
};

Porównujesz następnie w sposób:

if ( Z1 == Z2 ) /*...*/ ; 
0

Ale ja chce porównywać po id podanym przez parametr funkcji.

1

Z tego co mi się wydaje, to po prostu potrzebujesz czegoś takiego:

Zawodnik znajdz_zawodnika( int id, const list<Zawodnik>& lista )
{
	list<Zawodnik>::iterator it = lista.begin();
	for( int i = 0; i < id; ++i )
		it++;

	return *it;
}

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