Klasy, konstruktory, dziedziczenie, metody wirtualne - co i jak?

0

Witam!
Dałem sobie radę z dwoma projektami, teraz przyszedł trzeci, z C++ i programowania obiektowego i niestety potrzebuję pomocy :)
Mój projekt dotyczy klas. Muszę zrobić coś w stylu bazy danych, temat chyba dość popularny, ale nie znalazłem na razie odpowiedzi na swoje pytania. W projekcie muszę mieć:

  • dziedziczenie klas
  • metody wirtualne
  • konstruktory w tym konstruktor domyślny, kopiujący i z parametrami
  • destruktory
  • przeciążony operator przypisania
  • dynamiczne dodawanie i usuwanie nowych osób w bazie (czyli poprzez new i delete)
  • musi być wybór pomiędzy uruchamianiem funkcji wirtualnych i niewirtualnych.

To jest mój pierwszy projekt z programowania obiektowego i na razie nie wiem niestety za bardzo z czym to się je i byłbym wdzięczny gdyby ktoś mi polecił jakąś stronę gdzie te całe klasy są dobrze wytłumaczone. No ale do rzeczy:
Poradziłem już sobie z klasami i dziedziczeniem, stworzyłem 2 klasy:

  • klasę osoba, zawierającą pola - Imię, Nazwisko; i metody - wyświetl_dane, pobierz_imie, pobierz_nazwisko;
  • klasę uczeń, dziedziczącą do osobie imię i nazwisko, oraz mającą własne pola typu średnia itp. oraz mającą metody takie jak: pobierz_srednia
    No i teraz główne pytanie - jak rozplanować program, żeby spełnić wszystkie polecenia? Potrzebuję pomysłu i paru wskazówek :)
    Na razie zrobiłem tylko tyle, że tworzę sobie ile tam chce obiektów klasy uczeń, i za pomocą metod "pobierz" wprowadzam do nich dane i kiedy chcę to mogę to wszystko wyświetlić, czyli działa tak jak powinno. Jak wykorzystać konstruktory, metody wirtualne i całą resztę?
0

Konstruktory: możesz tworzyć osobę podając od razu imie i nazwisko jako argumenty konstruktora.
Metody wirtualne: wyświetl dane moze być wirtualna, dla osoby zwraca tylko info o imieniu i nazwisku, dla Ucznia dokłada info o średniej

0

Ok, poczytałem nieco o konstruktorach, trochę się rozjaśniło, ale teraz mam kolejne pytanie:
jak zrobić dynamiczną bazę danych? Tzn. żeby rekordów było ile się użyszkodnikowi spodoba, na razie mam takie coś:


student *studenci[10]; // 10-elementowa tablica wskaźników
int index = 0; // indeks studenta

void dodaj_studenta() {
    string imie;
    string nazwisko;
    float srednia;
    string kierunek;
    int nr_semestru;
    int nr_indeksu;
    if(index < 10){
    // Pobieranie danych
    cout << "Imie: ";
    cin >> imie;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Nazwisko: ";
    cin >> nazwisko;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Srednia: ";
    pobierz(2.0, 5.0, &srednia);
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Kierunek: ";
    cin >> kierunek;

    cout << "Numer semestru: ";
    pobierz(1, 9, &nr_semestru);
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    cout << "Numer indeksu: ";
    pobierz(100000, 999999, &nr_indeksu);
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    // Ok, jak już porałem dane to tworzę dla danego indeksu, za pomocą konstruktora nowy obiekt klasy student

    studenci[index] = new student(imie, nazwisko, srednia, kierunek, nr_semestru, nr_indeksu);
    index++; // Zwiększam indeks dla kolejnego studenta
    }
    else cout << "Baza danych przepelniona! Nie mozna dodac kolejnego rekordu!\n";

Czyli mogę sobie dodawać studentów, ale do określonego z góry limitu. Jak to zrobić dynamicznie? W C był realloc, tutaj tego nie ma. Jak zrobić, że jak mam np. już 10 studentów i chcę dodać jedenastego to żeby mi się alokowała pamięć dla jedenastego ale żebym nie tracił tych 10 co już zrobiłem? Trzeba jakoś wykorzystać konstruktor kopiujący?

0

C był realloc, tutaj tego nie ma.
Jak nie ma jak jest. Zwłaszcza że piszesz raczej w „C with cout” niż we właściwym C++ ;-)

Tworzysz statyczną tablicę 10 wskaźników — takiej nie da się zmienić rozmiaru. Możesz za to zrobić ją dynamicznie, czyli jako student* *studenci;, a potem studenci = new student*[10];, albo jak w C funkcją malloc/calloc. C++-owego odpowiednika dla realloc rzeczywiście nie ma, ale zwykły realloc() też powinien zadziałać.

0

Problem z dynamiczną alokacją rozwiązałem poprzez użycie kontenera <vector> (jeszcze nie wiem czy mogę go użyć, ale tymczasowo może być). Na chwilę obecną mój program wygląda tak:
funkcje.h - http://pastebin.com/KwNsju9n
klasy.h - http://pastebin.com/AVuqXxR3
funkcje.cpp - http://pastebin.com/CXJqDc8n
klasy.cpp - http://pastebin.com/Bc4EvT11
main.cpp - http://pastebin.com/JJWxAiGv

i działa tak jak powinien (przynajmniej tak mi się wydaje ;P). Chyba wykorzystałem wszystkie metody, które miałem wykorzystać.
Dziękuję wszystkim za pomoc i cenne wskazówki :)

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