C++ funkcje wirtualne

mikkuexc
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 19 maja 2011, o 20:33
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 5 razy

C++ funkcje wirtualne

Post autor: mikkuexc »

Witam. Mam pewne zadanie do opracowania, a mianowicie:
Proszę napisać klasę reprezentującą zebranie.

Zebranie posiada następujące cechy:
- miejsce spotkania
- termin spotkania
- listę uczestników

W zebraniu mogą uczestniczyć:
- Studenci
- Profesorowie
- Technicy

Każda z tych grup MUSI być reprezentowana przez osobną klasę i posiada swoje indywidualne cechy:
Student - numer indeksu
Profesor - tel. kontaktowy
Technik - godziny pracy i nr pokoju w którym przebywa


Klasa zebranie pozwala na:
- określenie terminu i miejsca spotkania
- dodanie uczestnika do listy
- wyświetlenie informacji o uczestnikach

Tutaj mój kod:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <string>
#include <iostream>

class Osoba
{
      protected:
              std::string imie;
              std::string nazwisko;
      public:
             Osoba(std::string im, std::string nazw): 
                               imie(im),nazwisko(nazw){};
};

class Student : public Osoba
{
      private:
              int nrindex;
      public:
             Student(std::string im, std::string nazw, int nr):
                                 Osoba(im,nazw), nrindex(nr){};
};

class Profesor : public Osoba
{
      private:
              std::string nrkontakt;
      public:
             Profesor(std::string im, std::string nazw, std::string nr):
                                  Osoba(im,nazw), nrkontakt(nr){};
};

class Technik : public Osoba
{
      private:
              int nrpokoju;
      public:
             Technik(std::string im, std::string nazw, int nr):
                                 Osoba(im,nazw), nrpokoju(nr){};
};

class Zebranie
{
      private:
              std::string miejscspotkania;
              std::string termin;
      public:
             Zebranie(std::string miejsc, std::string term):
                                  miejscspotkania(miejsc), termin(term){};
            //tutaj jakas metoda ktora doda uczestnika
            // metoda info
}
int main()
{
Zebranie z("308-C5", "wtorek 11.30");
z.dodaj(new Student("Jan", "Kowalski", 123456));
z.dodaj(new Profesor("Adam", "Nowak", "71-333-33-33"));
z.dodaj(new Technik("Krzysztof", "Jakiśtam", 8));


z.info();

return 0;

}
I teraz moje pytanie jest takie. Metoda dodaj otrzymuje wskaznik do obiektu. W jaki sposób zapisać nowego uczestnika(metoda dodaj), oraz jak powinna wyglądać funkcja info. Czy ta funkcja info powinna być wirtualna?
Jedyny pomysł jaki przychodzi mi do głowy to coś takiego:

Kod: Zaznacz cały

//Klasa zebranie
Osoba *obj1;
void dodaj(Osoba *obj)
{
*obj1=*obj;
}
A z tą metodą info to powiem szczerze nie mam pojęcia. Powinna być w każdej klasie i potem być wywoływana przez wskaźnik do danego obiektu? Proszę o podpowiedź i wytłumaczenie.
Dzięki i pozdrawiam.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

C++ funkcje wirtualne

Post autor: soku11 »

1. Dwa razy dołączyłeś iostream.
2. Klasa osoba powinna posiadać wirtualny destruktor.
3. W parametrach przekazuj wszystkie stringi przez stałą referencję.
4. Przechowuj osoby w wektorze STL, tzn:

Kod: Zaznacz cały

std::vector<Osoba*> osoby;
Dzięki temu możesz przechowywać wszystkie klasy dziedziczące po osobie.
5. Sama funkcja info nie musi być wirtualna. Wirtualne powinny być tylko te funkcje z klasy, które mają zmieniać swoje zachowanie w klasach dziedziczących. U ciebie nic nie dziedziczy po zebraniu.
Samą funkcję możesz zrealizować jak przejście po wektorze uczestników i wywołanie na każdej osobie metody, który zwróci jej opis. To ta funkcja będzie wirtualna, gdyż każdy uczestnik może się przedstawiać na swój sposób.
mikkuexc
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 19 maja 2011, o 20:33
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 5 razy

C++ funkcje wirtualne

Post autor: mikkuexc »

Rozumiem. Czy w takim razie klasa zebranie nie musi dziedziczyć po osobie? Jeżeli mam użyć metody z klasy osoba i pochodnych? Pozdrawiam.-- 22 maja 2011, o 12:27 --Potrzebuje podpowiedzi. Gdzie tu jest błąd?

Kod: Zaznacz cały

class Zebranie
{
      private:
              std::string miejscspotkania;
              std::string termin;
              std::vector<Osoba*> osoby;
      public:
             Zebranie(std::string miejsc, std::string term):
                                  miejscspotkania(miejsc), termin(term){};
             void dodaj(Osoba *obj)
             {
                  osoby.push_back(*obj);
                  }
};
                  
int main()
{
Zebranie z("308-C5", "wtorek 11.30");
z.dodaj(new Student("Jan", "Kowalski", 123456));
z.dodaj(new Profesor("Adam", "Nowak", "71-333-33-33"));
z.dodaj(new Technik("Krzysztof", "Jakiśtam", 8));
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

C++ funkcje wirtualne

Post autor: soku11 »

1. Głupie pytanie z tym dziedziczeniem. Odkąd zebranie jest osobą? Opisałem co trzeba zrobić we wcześniejszym poście (wprowadzić funkcję wirtualną do klasy osoba).
2. Błąd w kodzie jest w linijce 12. Kontener akceptuje wskaźniki na osoby. W parametrze dostajesz wskaźnik na metodę. Jedynce co trzeba zrobić, to dodać ten wskaźnik. Po co robisz tam dereferencję? Poprzez taką operację próbujesz do kontenera wskaźników wrzucić obiekt bądź referencję.
3. Pamiętaj o usuwaniu stworzonych osób. Kwestią istotną jest tylko gdzie to wrzucić.
ODPOWIEDZ