Problem z dynamicznym dodawaniem obiektu

0

Cześć, pisze projekt z programowania i jednym z jego założeń jest aby obiekty jednej z klas były dodawane dynamicznie i można było zmieniać ich liczbę w czasie trwania programu. Moim tematem jest zarządzanie firmą budowlaną, w projekcie posiadam klasę pracownik i dynamicznie dodaje obiekty właśnie tej klasy. Jednak klasą główną jest firma i to w niej znajduje się metoda dodaj_pracownika. Mam jednak problem, ponieważ,gdy wywołuję metodę dodaj pracownika normalnie w kodzie to działa poprawnie, ale gdy chce w switchu dodać opcję "dodaj pracownika" to nie wiedzieć czemu program przestaje działać po wybraniu tej własnie opcji. Poniżej kod, jeśli napisałem niejasno z góry przepraszam. Jeżeli potrzebne będą większe fragmenty kodu proszę o informację. Dodałem tresc bledu w metodzie dodaj_pracownika.

 void Firma::dodaj_pracownika()//metoda dodawania pracownika
{
    int temp = pracownik->zwroc_ile();
    Pracownik* starzy_pracownicy = pracownik;
    pracownik = new Pracownik[temp+1];
    for (int i = 0; i < temp; i++)
    {
        pracownik[i] = starzy_pracownicy[i];
                     /*W tym miejscu podczas proby uzycia w switchu czasem wywala aplikacje i wyswietla sie "Zgloszono nieobslugiwalny wyjatek:naruszenie dostepu do odczytu. _that bylo nullptr.*/
    }
    delete []starzy_pracownicy;
}

Firma::Firma(const Firma&firma) //konstruktor kopiujacy, mam w kodzie jeszcze dwa inne(zalozenia projektu)
{
    licz_pracownikow = firma.licz_pracownikow;
    nazwa = firma.nazwa;
    cena_m = firma.cena_m;
    pracownik = new Pracownik[licz_pracownikow];
    for (int i = 0; i < licz_pracownikow; i++)
    {
        pracownik[i] = firma.pracownik[i];
    }
    klient = firma.klient;
    materialy = firma.materialy;
    opinia = firma.opinia;
}

test1.dodaj_pracownika(); // w taki sposob jak napisze w dowolnym miejscu w kodzie to dodaje poprawnie

//switch tu nie dziala
int a;
        do
        {
            menu();
            cin >> a;
            switch (a)
            {
            case 1:
                test1.dodaj_pracownika();
                break;
            case 2:
                m1.wyswietl_materialy();
                break;
            case 3:
                p1.wyswietl_info();
                break;
            case 4:
                test1.wyswietl_nazwe();
                test1.wyswietl_opinie();
                break;
            case 5:
                m1.wyswietl_koszt();
                break;
            case 6:
                m1.wyswietl_materialy();
                break;
            case 7:
                cout << "Calkowity koszt wykonania budowy wynosi: " << k1.zwroc_metraz()*test1.zwroc_cena_m();
                break;
            case 8:
                float calk;
                calk = k1.zwroc_metraz()*test1.zwroc_cena_m();
                if (k1.zwroc_cene() < calk)
                    cout << "Klienta stac, jest wniebowziety!" << endl;
                else if (k1.zwroc_cene() == calk)
                    cout << "Idealna cena dla klienta!" << endl;
                else
                    cout << "Klient bedzie musial siegnac glebiej do kieszeni!" << endl;
                break;
            case 9:
                test1.ile_pracownikow();
                break;
            default:
                cout << "Nie rozpoznana opcja!" << endl;
                break;
            }
        } while (a != 10);
1

Jak rozumiem pracownik jest polem klasy Firma, więc musisz wytłumaczyć co chcesz osiągnąć w tej linijce:

pracownik = new Pracownik[temp+1];

edit: Pytam, ponieważ przypisujesz temu wskaźnikowi zaalokowany obszar pamięci, podczas gdy ten wskaźnik aktualnie już wskazuje na inny obszar, skoro używasz go tutaj: pracownik->zwroc_ile();
Co więcej: pracownik na początku jest wskaźnikiem na klasę lub strukturę, co wnioskuję po użyciu operatora -> podczas gdy we wspomnianej linijce próbujesz przypisać mu zaalokowaną całą tablicę obiektów...
Albo czegoś nie rozumiem i musisz mi to rozjaśnić, albo Ty bardzo nie rozumiesz działania wskaźników.

Po drugie musisz upewnić się (czyli użyć debugger'a) gdzie masz jaki obszar zaalokowany, bo ewidentnie gdzieś wykraczasz poza zaalokowany obszar - nie ma tu żadnej tajemnicy skoro masz wyraźny komunikat przy wywalaniu aplikacji.


edit2: Po trzecie: Jeśli potrzebujesz dynamicznej tablicy czegokolwiek to użyj vector'a, każdy Ci to powie. Jest wygodniej, czyściej, bezpieczniej.

edit3: Pozwolę sobie pomóc Ci i dam przykład użycia vectora:

class Company
{
public:
    void AddEmployee( Employee&& newEmployee )
    {
        employeers.push_back( std::move( newEmployee ) );
    }
private:
    std::vector< Employee > employeers;
}

Pisane na szybko, ale pokazuje Ci to, że nowego pracownika można przerzucić (za pomocą std::move) do firmy praktycznie w jednej linijce. Nie musisz też przechowywać liczby pracowników, bo vector dostarcza Ci metodę: size(), która wyrzuca rozmiar Twojej dynamicznej tablicy.


No, to by było na tyle...
Powodzenia!

0

Dzięki za pomoc, wskaźniki to dla mnie faktycznie jeszcze nie jest do końca zrozumiały temat, ale przysiąde do niego porządnie. Co do użycia vectora to super wiedzieć, że jest coś takiego, jednak chyba w tym projekcie muszę zostawić to tak jak jest (to alokowanie pisałem razem ze swoim prowadzącym na labkach, tym większe moje zdziwienie, że coś jest nie halo). Przestudiuje twoje wskazówki powoli i postaram się poprawić kod :)

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