Przekazywanie obiektu z funkcji do funkcji

0

Witam.
Postanowiłem nauczyć się obiektówki, ale trafiłem na problem. W ramach ćwiczeń robię program, który przechowuje dane o pilkarzach.
Problem jest taki:
Wpisuję do funkcji void dodaj_pilkarza() odpowiednie dane o piłkarzach. Następnie próbuję poprzez funkcję void wyswietl_dane() zobaczyć to, co wprowadziłem. I za cholerę to nie działa. Jak wiadomo kompilator duplikuje wszystkie parametry funkcji a następnie po jej zakończeniu usuwa je. Więc oczywiste jest, że po przejściu z void dodaj_pilkarza()</code> do <code>void wyswietl_dane() nic sie nie wyswietla.
Dowiedziałem się, że z pomocą przyjdą mi wskaźniki i przeciążenie operatorów (jeśli się mylę to proszę o poprawienie mnie). Gdy dałem wskaźnik na obiekt w funkcji program nie chce się skompilowac i wyskakuje następujący błąd:

no instance of overloaded function "std::list<_Ty, _Alloc>::push_back [with _Ty=Pilkarz, _Alloc=std::allocator<Pilkarz>]" matches the argument list	

oraz

syntax error: '&&'	obiektowka	
 

Jak to naprawić ?
Poniżej zamieszczam kod:

 

#include<iostream>
#include <string>
#include <process.h>
#include <list>
#include <cstddef>

using namespace std;


class Pilkarz
{
private:

	string imie;
	string nazwisko;
	int wiek;
	string pozycja;
public:
	Pilkarz();  //to jest konstruktor.
	~Pilkarz();//destruktor

	void dodaj_pilkarza()
	{
		Pilkarz *p1=new Pilkarz;
		list<Pilkarz>baza;
		list<Pilkarz>::iterator i;

	

		cout << "DODAWANIE PILKARZA" << endl;
		cout << "Podaj imie: ";
		cin >> p1->imie;
		cout << "Podaj nazwisko: ";
		cin >> p1->nazwisko;
		cout << "Podaj wiek: ";
		cin >> p1->wiek;
		cout << "Podaj pozycje: ";
		cin >> p1->pozycja;
		baza.push_back(p1);
		cout << p1->imie << " " << p1->nazwisko << ", " << p1->pozycja << ", lat: " << p1->wiek << endl;


	}

	void wyswietl_dane()
	{
		Pilkarz p1;
		list<Pilkarz>baza;
		list<Pilkarz>::iterator i;
		int nr = 1;


		for (i = baza.begin(); i != baza.end(); i++)
		{
			for (i = baza.begin(); i != baza.end(); i++)
				p1 = *i;
			cout << nr << p1.imie << " " << p1.nazwisko << ", " << p1.pozycja << ", lat: " << p1.wiek << endl;
			nr++;
		}



		}
	

};
Pilkarz::Pilkarz()//definicja konstruktora
{
	imie = "Jan";
	nazwisko = "Kowalski";
	wiek = 20;
	pozycja = "napastnik";
}
Pilkarz::~Pilkarz()
{
	cout<<"Destrukto dziala !"<<endl;
}

void menu() {
	int odp=0;
	do
	{
		cout << "-------------------------" << endl;
		cout << "--- Co chcesz zrobic: ---" << endl;
		cout << "| 1. Dodaj rekord       |" << endl;
		cout << "| 2.Usun rekord         |" << endl;
		cout << "| 3. Wyswietl rekordy   |" << endl;
		cout << "| 4. Zapisz do pliku    |" << endl;
		cout << "| 5. Wczytaj z pliku    |" << endl;
		cout << "| 6. Zakoncz program    |" << endl;
		cout << "-------------------------" << endl;

		cin >> odp;
	
		switch (odp)
		{
			case 1: //dodaj rekord
			{
				Pilkarz p1;   //obiektem jest p1, wedlug przepisu(klasy) o nazwie pilkarz. 
				p1.dodaj_pilkarza();
				p1.wyswietl_dane();
			} // ZAPAMIĘTAĆ: jak w case nie dam klamerek to klasa nie będzie chciała się wykonać
			continue;
			case 2://usun rekord
			{
				cout << "opcja 2<<" << endl;

			}
			continue;
			case 3://wyswietl rekordy
			{
				Pilkarz p1;
				p1.wyswietl_dane();


			}
			continue;
			case 4:
			{
				cout << "opcja 4<<" << endl;

			}
			continue;
			case 5:
			{
				cout << "opcja 5<<" << endl;

			}
			continue;

			case 6:
			{
				cout << "opcja 6<<" << endl;

			}
			break;
		default:
			cout << "Wybrano bledny numer. Prosze podac wartosc z zakresu od 1 do 7.";
		}
		break;
	} while (odp != 6);

}

int main()
{
	menu();

//	system("pause");
	return 0;
}

2

Dowiedziałem się, że z pomocą przyjdą mi wskaźniki i przeciążenie operatorów (jeśli się mylę to proszę o poprawienie mnie).
Lektura do poduszki: Przekazywanie parametru przez wartość i referencję

Pilkarz();  //to jest konstruktor.

Nie pisz takich oczywistych, nic nie wnoszących komentarzy.

Kompilator krzyczy o to, że próbujesz dodać wskaźnik do listy

baza.push_back(p1);

podczas gdy push_back() oczekuje obiektu.

A w ogóle to cała rzecz jest błędna, bo

list<Pilkarz>baza;

baza jest zmienną lokalną i zniknie po wyjściu z funkcji. Ta lista powinna być polem klasy, tak jak imie, nazwisko itd.

1
new Pilkarz 

nie używaj gołych new tylko smart pointerów.
Poza tym, w twoim kodzie wskaźnik nic nie wnosi.

Poszedłbym w tym kierunku:

#include <iostream>
#include <string>
#include <set>
using namespace std;

struct Player {
    string name;
    string surname;
    unsigned age;
    string positionOnThePitch;
    
    friend istream& operator>>(istream& is, Player& player){
        is >> player.name >> player.surname >> player.age >> player.positionOnThePitch;
        return is;
    }
};
 
class ComparePlayers {
public:
    bool operator()(const Player& left, const Player& right) {
        return left.surname < right.surname;
    }
};
 
class SoccerTeam {    
    set<Player, ComparePlayers> team; // zamiast std::set<> może być std::vector<>
public:
    // konstruktory
    void appendSoccerPlayer() {
        Player player;
        cin >> player;
        team.insert(player);
    }
 
    friend ostream& operator<<(ostream& os, const SoccerTeam&  soccerTeam) {
        for (auto const& elem : soccerTeam.team) {
            os << elem.name << ' ' << elem.surname << "\nwiek " 
                << elem.age << "\npozycja" << elem.positionOnThePitch << '\n';
        }
        return os;
    }
};
 
int main()
{
    SoccerTeam soccerTeam;
    soccerTeam.appendSoccerPlayer();
    soccerTeam.appendSoccerPlayer();
    cout << soccerTeam << '\n';
} 
 

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