vector jako statyczny element klasy?

0

Witam, mam klasę piłkarz i chciałbym się zapytać czy da się jakoś powiązać vector z klasą (np jako statyczny element tej klasy) żeby zamiast robić tak

int main()
{
   vector <pilkarz*> tablica
   string imie;
   cin >> imie;
   tablica.pushback(new pilkarz(imie));
   return 0;
}
 

zrobić jakoś tak:

 class pilkarz
{
   static vector<pilkarz> tablica;
///
zmienne i metody
///
}
////////
int main ()
{
   vector pilkarz::tablica;
   string imie;
   cin >> imie;
   tablica.pushback(new pilkarz(imie));
   return 0;

?

1
#include <iostream>
#include <memory>
#include <vector>

class pilkarz {
public:
   static std::vector<pilkarz> tablica;
};

std::vector<pilkarz> pilkarz::tablica;

int main () {
   pilkarz p;
   pilkarz::tablica.push_back(p);
   return 0;
}

Tak?

0

Okej, tylko co jak chciałbym to co napisałeś opakować w funkcję do dodawania piłkarzy do tablicy (by potem np. posortować ją alfabetycznie po imieniu)

void dodaj()
{
   pilkarz p;
   pilkarz::tablica.push_back(p);
}
 

Będzie działać? Bo za każdym razem będę tworzyć obiekt p. Swoją drogą trochę gubię się w tej obiektówce.

0
#include <iostream>
#include <memory>
#include <vector>
 
class pilkarz {
public:
   pilkarz(const std::string &imie) : imie(imie) { }

   std::string imie;
   static std::vector<pilkarz> tablica;
};
 
std::vector<pilkarz> pilkarz::tablica;

void dodaj (const std::string &imie) {
   pilkarz p{imie};
   pilkarz::tablica.push_back(p);
}
 
int main () {
   dodaj("krzak");
   return 0;
}
0

Może wyjaśnij troche dokładniej co chcesz osiągnąć, bo na moje oko coś przekombinowujesz :)

0

Mam klasę piłkarz i chciałbym mieć vector przechowujący obiekty typu piłkarz. Na tym vectorze chciałbym wykonywać takie operacje jak: dodaj nowego piłkarza, usuń piłkarza, edytuj jego imię/nazwisko/pensję itp., posortować np. alfabetycznie po imieniu, czy po najwyższej pensji. I teraz nie wiem czy vector dać jako statyczny element klasy i operować na nim publicznymi metodami DodajPilkarza, EdytujPilkarza, czy utworzyć vector w main-ie (tylko jak się wtedy odwoływać do elementów prywatnych? musiałbym robić metody GetImie, GetNazwisko, GetPensja które zwracają imię, nazwisko, pensję itd. i te metody wrzucać do ciał funkcji definiowanych poza klasą).?

4

I teraz nie wiem czy vector dać jako statyczny element klasy

Można, ale tak się nie robi.
Piłkarz to piłkarz, a zbiór piłkarzy to nie piłkarz tylko drużyna. Zdefiniuj więc osobną klasę drużyny i tam umieść vector.

0
#include <vector>
#include <iostream>
#include <string>

class Footballer
{
private:
    std::string name_;
    std::string surname_;
    unsigned short age_;
    int pay_;
public:
    Footballer( const std::string& name = "", const std::string& surname = "", 
                unsigned short age = 0, int pay = 0)
        :
        name_{ name },
        surname_{ surname },
        age_{ age },
        pay_{ pay }
    {}
    // ....
    friend std::ostream& operator<<(std::ostream& os, const Footballer& footballer)
    {
        return os << footballer.name_ << ' ' << footballer.surname_ << '\n'
            << footballer.age_ << '\n' << footballer.pay_;
    }
};

class FootballTeam
{
private:
    std::vector<Footballer> team_;
public:
    void addFootballer()
    {
        team_.push_back(Footballer("Janek", "Dwielewenogi", 22, 100000));
    }

    friend std::ostream& operator<<(std::ostream& os, const FootballTeam& footballTeam)
    {
        for (auto const& element : footballTeam.team_)
        {
            os << element << "\n\n";
        }
        return os;
    }
};

auto main() ->int
{
    FootballTeam team;
    team.addFootballer();

    std::cout << team << '\n';
} 
0

okej, zrobiłem tak:

 
class team : public pilkarz
{
private:
	vector<pilkarz> team_;
public:
	team() : pilkarz()
	{

	}
	void dodajPilkarza(string uimie, string unazwisko, string upozycja)
        {
	            team_.push_back(pilkarz(uimie, unazwisko, upozycja));
        }
	void usunPilkarza(int uID)
        {
	            team_.erase(team_.begin() + uID);
        }
	void wyswietlPilkarzy()
        {
	if (team_.size() == 0)
		cout << "Brak pilkarzy do wyswietlenia" << endl;
	else
	{
		for (size_t i = 0; i < team_.size(); i++)
		{
			cout << team_[i];
		}
	}
        }
	friend void UstawPozycja(int uID)
	{
		char wybor = '9';
		do
		{
			cout << "Wybierz pozycje na jakiej gra pilkarz: " << endl;
			cout << "1. Bramkarz" << endl;
			cout << "2. Obronca" << endl;
			cout << "3. Pomocnik" << endl;
			cout << "4. Napastnik" << endl;
			cout << "X Powrot" << endl;
			cin >> wybor;

			switch (wybor)
			{
			case 1:
				**tutaj chcialbym zmienic pozycje zawodnika** = "Bramkarz"; 
                                   **jak sie odwolac do zmiennej pozycja w vectorze obiektów piłkarz z klasy team?**

			case 2:
				**tutaj chcialbym zmienic pozycje zawodnika** = "Obronca";
			case 3:
				**tutaj chcialbym zmienic pozycje zawodnika** = "Pomocnik";
			case 4:
				**tutaj chcialbym zmienic pozycje zawodnika** = "Napastnik";
			default:
				cout << "Brak takiej opcji! " << endl;

			}
			system("cls");
		} while (wybor != 'x');

	}

};

zmienna pozycja jest elementem klasy piłkarz, którego konstruktor wygląda następująco

 
pilkarz(string uimie, string unazwisko, string upozycja) : imie(uimie), nazwisko(unazwisko), pozycja(upozycja)
0

Okej pogłówkowałem i doszedłem do czegoś takiego: (dla tego problemu uprościłem kod, aby łatwiej się go czytało)

class team : public pilkarz
{
private:
    vector<pilkarz> team_;
public:
    //...
   void UstawPozycja(int uID, team& ob) //referencja bo po co kopiowac caly obiekt + nie mam zdefiniowanego konstruktora kopiujacego
	{
		ob.team_[uID].pozycja = "test";  // dla zadanego ID zmieniam pozycje gracza
	}
};

 

Zmienna pozycja jest dziedziczona od pilkarza, kompilator wywala błąd, że nie ma dostępu do składowej prywatnej jaką niewątpliwie jest pozycja. Dlatego zaprzyjaźniłem klasę piłkarz z klasą team.
Nie wiem czy to dobra praktyka programistyczna, ale jako że gonią mnie terminy cieszę się, że działa.

1
  1. Po co ta referencja?
  2. Metoda ustawienia pozycji powinna być w klasie pilkarz
  3. Totalnie nie rozumiem dziedziczenia w tym przypadku
  4. Skoro już używasz polskich nazw to zamiast 'team' powinien być 'zespol' lub 'druzyna'
0

Zamiast class team : public pilkarz może lepiej po prostu:
class team : public std::vector<pilkarz> { /* ... */ };
Wtedy nie trzeba już obiektu wewnątrz klasy.

2
mwl4 napisał(a):

Zamiast class team : public pilkarz może lepiej po prostu:
class team : public std::vector<pilkarz> { /* ... */ };
Wtedy nie trzeba już obiektu wewnątrz klasy.

Co? Nie! Nie w ten sposób projektuje się aplikacje. ** Nie możesz ** dziedziczyc po stlowych typach jeśli nie wiesz dokładnie co robisz i nie masz ** naprawdę ** dobrego wytłumaczenia. Poza tym - kompozycja jest dużo częściej lepszym pomysłem niż dziedziczenie.

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