vector jako statyczny element klasy?

Odpowiedz Nowy wątek
Karmelowy Adam
2016-06-07 22:36
Karmelowy Adam
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;

?

Pozostało 580 znaków

2016-06-07 23:05

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Kraków

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?


Pozostało 580 znaków

Karmelowy Adam
2016-06-07 23:14
Karmelowy Adam
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.

Pozostało 580 znaków

2016-06-07 23:18

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Kraków

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;
}

edytowany 1x, ostatnio: pingwindyktator, 2016-06-07 23:18

Pozostało 580 znaków

2016-06-07 23:36

Rejestracja: 4 lata temu

Ostatnio: 14 godzin temu

0

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

Pozostało 580 znaków

Karmelowy Adam
2016-06-08 10:10
Karmelowy Adam
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ą).?

Pozostało 580 znaków

2016-06-08 10:30

Rejestracja: 16 lat temu

Ostatnio: 1 minuta temu

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.

Pozostało 580 znaków

2016-06-08 11:47

Rejestracja: 4 lata temu

Ostatnio: 4 miesiące temu

Lokalizacja: Pabianice

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';
} 

edytowany 1x, ostatnio: carlosmay, 2016-06-08 21:25
@pingwindyktator jezeli cos komentujesz, wypadaloby to robic konstryktywnie i wskazac oraz wyjasnic. - fasadin 2016-06-08 12:20
Dlaczego FootballTeam dziedziczy po Footballer? - pingwindyktator 2016-06-08 12:22
@pingwindyktator Bo miałem "genialny" pomysł i się z niego wycofałem. Nieumiejętne zacieranie śladów "przestępstwa". Dopiero teraz mam możliwość edycji kodu. Widzę, że trochę się przez to namieszało. - carlosmay 2016-06-08 21:27

Pozostało 580 znaków

Karmelowy Adam
2016-06-08 15:21
Karmelowy Adam
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)

Pozostało 580 znaków

Karmelowy Adam
2016-06-08 17:44
Karmelowy Adam
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.

Pozostało 580 znaków

2016-06-08 19:51

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

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'

#duda2020
1. żeby uniknąć kopiowania obiektu co może być bardzo kosztowne, bo tam w środku jest std::vector - pingwindyktator 2016-06-08 20:12
Ale przecież ani wektor ani metoda UstawPozycje nie są statyczne, więc po to ten parametr? - tajny_agent 2016-06-09 23:06
Fakt, nie zauważylem. - pingwindyktator 2016-06-10 08:44

Pozostało 580 znaków

Odpowiedz

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