Dlaczego program się kraszuje przy wywołaniu konstruktora?

0
#include <iostream>
#include <string.h>
/////////////////////////////zwykla klasa///////////////////////////////
using namespace std;
class osoba
{
        char nazwisko[30];
    public:
        //dorobic konstruktor kopiujacy
        osoba(char * n = NULL)
        {
            strcpy(nazwisko, n);
        }
        friend ostream& operator <<(ostream& s, const osoba& o);
        friend ostream& operator <<(ostream& s, const osoba* wsk);
};
/////////////////////////////////////////////////////////////////////////
ostream& operator <<(ostream &s, const osoba &o)
{
    s<<o.nazwisko;
    return s;
}
ostream& operator <<(ostream &s, const osoba *wsk)
{
    s<<wsk->nazwisko;
    return s;
}
const int pojemnosc_wektora = 15;
/////////////////////////////////////klasa pojemnikowa/////////////////////////////////////
class wektor
{
        osoba tabl[pojemnosc_wektora];
        int ile_obiektow;
    public:
        wektor():ile_obiektow(0)
        {
            cout<<"Jestem konstruktor:";
        }
        int wstaw(const osoba &nowy, int gdzie = -1);
        void usun(int nr);
        osoba & co_na(int pozycja){return tabl[pozycja];}
        friend ostream &operator<<(ostream &stru, wektor &x);
    private:
        void rozsun(int pozycja);
        void zsun(int nr);
};
//koniec definicji klasy
ostream &operator<<(ostream &stru, wektor &spis)
{
    stru<<"   ";
    for(int i  = 0; i < spis.ile_obiektow ; i++)
    {
        stru<< i << ") "<<spis.tabl[i]<<" \n";
    }
    return stru;
}
void wektor::rozsun(int pozycja)
{
    for(int i = ile_obiektow; i > pozycja; --i)
    {
        tabl[i] = tabl[i - 1];
    }
}

void wektor::zsun(int nr)
{
    for(int i = nr; i < ile_obiektow; ++i)
    {
        tabl[i] = tabl[i + 1];
    }
}
int wektor::wstaw(const osoba& nowy, int gdzie)
{
    if(ile_obiektow == pojemnosc_wektora)
    {
        std::cout<<"\nWektor juz zapelniony !\n";
        return 0;
    }
    if(gdzie < 0 || gdzie > ile_obiektow)
    {
        gdzie = ile_obiektow;
    }
    rozsun(gdzie);
    tabl[gdzie] = nowy;
    ile_obiektow++;
    return 1;
}
void wektor::usun(int nr)
{
    if(nr < ile_obiektow)
    {
        zsun(nr);
        ile_obiektow--;
    }
}
int main()
{
    osoba wloch("Vivaldi"), niemiec("Bethoven"), austriak("Mozart"), polak("Chopin");
    std::cout<<"Przedstawia sie "<<wloch<<"\n";
    osoba* kapelmistrz = &austriak;
    std::cout<<"Kapelmistrzem jest dzis "<<*kapelmistrz<<"\n";
    wektor muzycy;
    std::cout<<"sizeof(muzycy) = "<<sizeof(muzycy)<<"\n";
    muzycy.wstaw(niemiec);
    muzycy.wstaw(wloch);
    std::cout<<muzycy<<"\n";
    muzycy.wstaw(polak, 1);
    std::cout<<" Po wpisie na pozycji 1\n"<<muzycy<<"\n";
    muzycy.wstaw(austriak, 2);
    std::cout<<" Po wpisie na pozycji 2\n"<<muzycy<<"\n";
    muzycy.usun(1);
    std::cout<<" Po usunieciu z pozycji 1\n"<<muzycy<<"\n";
    std::cout<<"co jest na pozycji pierwszej? "<<muzycy.co_na(1)<<"\n";
    wektor fizycy;
    osoba f1("Einstein");
    osoba f2("Bohr");
    fizycy.wstaw(f1);
    fizycy.wstaw(f2);
    std::cout<<"zawartosc w spisu fizykow:\n"<<fizycy;
    return 0;
} 

Program wywala przy wywolaniu konstruktora klasy wektor, co jest nie tak?
screen:

http://ifotos.pl/zobacz/kraszjpg_naaxrxn.jpg
http://s4.ifotos.pl/mini/kraszjpg_naaxrxn.jpg

poprawienie linku - fp

1

Zobacz na to:

osoba(char * n = NULL)
{
    strcpy(nazwisko, n);
}

Podczas wywołania konstruktora wektor konstruowanych jest pojemnosc_wektora obiektów klasy osoba. Uruchamia się domyślny konstruktor i robi strcpy(nazwisko, NULL). Więc wychodzi z tego null pointer dereference. Nie wiem co konkretnie ten kod miał robić, ale jest obrzydliwy i ja bym tego nikomu nie pokazywał.

0

To kod zywcem przepisany z pasji c++ Grębosza.
Dzięki za pomoc ;)

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