Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziedziczenie wielokrotne

Ostatnio zmodyfikowano 2016-05-07 16:01
Autor Wiadomość
zabsontoziomal
Temat założony przez niniejszego użytkownika
Dziedziczenie wielokrotne
» 2016-05-06 12:13:54
Witam.
          Gdy stworzyłem nową klasę Doktorant dziedzicząca wielokrotnie po Prowadzący(dziedziczy z Człowiek) i Stud2st(dziedziczy z Student, a Student z Czlowiek). I mam problem z tablicą do której wpisuję ulubioneKsiazki, ulubionePrzedmioty gdyż program się kompiluje, ale podczas wpisywania do nich danych gdy zostały wywołane wywala błąd 11 a w debuggerze napisane jest: EXCBADACCESS (code=1, address=0x0). Co może być problem w tym kodzie bo nie mogę się doszukać, jakieś pomysły?



C/C++
#include <iostream>
#include <string>

using namespace std;

class Czlowiek {
public:
    Czlowiek() {
    }
    Czlowiek( int wielkoscKsiazki, int rozmiarLicznik ) {
        licznik++;
       
        n = wielkoscKsiazki;
        ulubioneKsiazki = new std::string[ n ];
       
        obiekty = rozmiarLicznik;
        tablica = new int[ obiekty ];
       
        for( int i = 0; i < obiekty; i++ ) {
            tablica[ i ] = licznik;
        }
       
    }
    virtual ~Czlowiek() {
        //delete[] ulubioneKsiazki;
    }
public:
    int wiek, obiekty;
    std::string plec;
    std::string imie;
    std::string nazwisko;
    std::string * ulubioneKsiazki;
    int n;
    friend class Student;
    friend class Prowadzacy;
    friend class Student2;
    int * tablica;
    static int licznik;
public:
   
    friend std::istream & operator >>( std::istream & we, Czlowiek & _czlowiek ) {
        std::cout << std::endl;
        std::cout << "Podaj imie: ";
        we >> _czlowiek.imie;
       
        std::cout << "Podaj nazwisko: ";
        we >> _czlowiek.nazwisko;
       
        std::cout << "Podaj plec: ";
        we >> _czlowiek.plec;
       
        std::cout << "Podaj wiek: ";
        we >> _czlowiek.wiek;
       
        std::cout << "Podaj ulubione ksiazki: ";
        for( int i = 0; i < _czlowiek.n; i++ ) {
            we >> _czlowiek.ulubioneKsiazki[ i ];
        }
       
        return we;
    }
   
    friend std::ostream & operator <<( std::ostream & wy, const Czlowiek & _czlowiek ) {
        wy << "Imie: " << _czlowiek.imie << std::endl
        << "Nazwisko: " << _czlowiek.nazwisko << std::endl
        << "Plec: " << _czlowiek.plec << std::endl
        << "Wiek: " << _czlowiek.wiek << std::endl
        << "Ulubione ksiazki: ";
        for( int i = 0; i < _czlowiek.n; i++ ) {
            wy << _czlowiek.ulubioneKsiazki[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Licznik obiektow: ";
        for( int i = 0; i < _czlowiek.obiekty; i++ ) {
            wy << _czlowiek.tablica[ i ] << std::endl;
        }
       
        return wy;
    }
   
};

int Czlowiek::licznik = 0;


class Student
    : virtual public Czlowiek
{
public:
    Student()
        : Czlowiek()
    {
    }
    Student( int rozmiarKsiazki, int rozmiarLicznik, int rozmiarPrzedmioty )
        : Czlowiek( rozmiarKsiazki, rozmiarLicznik )
    {
        ulubionePrzedmiotyRozmiar = rozmiarPrzedmioty;
        ulubionePrzedmioty = new std::string[ ulubionePrzedmiotyRozmiar ];
    }
    ~Student() {
        //delete[] ulubionePrzedmioty;
    }
public:
    int indeks;
    int semestr;
    std::string kierunek;
    std::string wydzial;
    std::string * ulubionePrzedmioty;
    int ulubionePrzedmiotyRozmiar;
    friend class Student2;
public:
   
    friend std::istream & operator >>( std::istream & we, Student & _student ) {
        std::cout << std::endl;
        std::cout << "Podaj imie: ";
        we >> _student.imie;
       
        std::cout << "Podaj nazwisko: ";
        we >> _student.nazwisko;
       
        std::cout << "Podaj plec: ";
        we >> _student.plec;
       
        std::cout << "Podaj wiek: ";
        we >> _student.wiek;
       
        std::cout << "Podaj ulubione ksiazki: ";
        for( int i = 0; i < _student.n; i++ ) {
            we >> _student.ulubioneKsiazki[ i ];
        }
       
        std::cout << "Podaj nr indeksu: ";
        we >> _student.indeks;
       
        std::cout << "Podaj semestr: ";
        we >> _student.semestr;
       
        std::cout << "Podaj kierunek: ";
        we >> _student.kierunek;
       
        std::cout << "Podaj wydzial: ";
        we >> _student.wydzial;
       
        std::cout << "Podaj ulubione przedmioty: ";
        for( int i = 0; i < _student.ulubionePrzedmiotyRozmiar; i++ ) {
            we >> _student.ulubionePrzedmioty[ i ];
        }
       
        return we;
    }
   
   
    friend std::ostream & operator <<( std::ostream & wy, const Student & _student ) {
        wy << "Imie: " << _student.imie << std::endl
        << "Nazwisko: " << _student.nazwisko << std::endl
        << "Plec: " << _student.plec << std::endl
        << "Wiek: " << _student.wiek << std::endl
        << "Ulubione ksiazki: ";
        for( int i = 0; i < _student.n; i++ ) {
            wy << _student.ulubioneKsiazki[ i ] << std::endl;
        }
        wy << "Numer indeksu: " << _student.indeks << std::endl
        << "Semestr: " << _student.semestr << std::endl
        << "Kierunek: " << _student.kierunek << std::endl
        << "Wydzial: " << _student.wydzial << std::endl
        << "Ulubione przedmioty: ";
        for( int i = 0; i < _student.ulubionePrzedmiotyRozmiar; i++ ) {
            wy << _student.ulubionePrzedmioty[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Licznik obiektow: ";
        for( int i = 0; i < _student.obiekty; i++ ) {
            wy << _student.tablica[ i ] << std::endl;
           
        }
        return wy;
    }
   
   
   
};


class Prowadzacy
    : virtual public Czlowiek
{
public:
    Prowadzacy()
        : Czlowiek()
    {
    }
    Prowadzacy( int rozmiarKsiazki, int rozmiarLicznik )
        : Czlowiek( rozmiarKsiazki, rozmiarLicznik )
    {
    }
    ~Prowadzacy() {
    }
public:
    std::string tytul;
    int publikacje;
public:
   
    friend std::istream & operator >>( std::istream & we, Prowadzacy & _prowadzacy ) {
        std::cout << std::endl;
        std::cout << "Podaj imie: ";
        we >> _prowadzacy.imie;
       
        std::cout << "Podaj nazwisko: ";
        we >> _prowadzacy.nazwisko;
       
        std::cout << "Podaj plec: ";
        we >> _prowadzacy.plec;
       
        std::cout << "Podaj wiek: ";
        we >> _prowadzacy.wiek;
       
        std::cout << "Podaj ulubione ksiazki: ";
        for( int i = 0; i < _prowadzacy.n; i++ )
        {
            we >> _prowadzacy.ulubioneKsiazki[ i ];
        }
       
        std::cout << "Podaj tytul naukowy: ";
        we >> _prowadzacy.tytul;
       
        std::cout << "Podaj liczbe publikacji: ";
        we >> _prowadzacy.publikacje;
       
        return we;
       
    }
   
    friend std::ostream & operator <<( std::ostream & wy, const Prowadzacy & _prowadzacy ) {
        wy << "Imie: " << _prowadzacy.imie << std::endl
        << "Nazwisko: " << _prowadzacy.nazwisko << std::endl
        << "Plec: " << _prowadzacy.plec << std::endl
        << "Wiek: " << _prowadzacy.wiek << std::endl
        << "Ulubione ksiazki: ";
        for( int i = 0; i < _prowadzacy.n; i++ ) {
            wy << _prowadzacy.ulubioneKsiazki[ i ] << std::endl;
        }
        wy << "Tytul: " << _prowadzacy.tytul << std::endl
        << "Publikacje: " << _prowadzacy.publikacje << std::endl;
        wy << "Licznik obiektow: ";
        for( int i = 0; i < _prowadzacy.obiekty; i++ ) {
            wy << _prowadzacy.tablica[ i ] << std::endl;
           
        }
       
        return wy;
    }
   
   
};


class Stud2st
    : public Student
{
public:
    Stud2st()
        : Student()
    {
    }
    Stud2st( int rozmiarKsiazki, int rozmiarLicznik, int rozmiarPrzedmioty )
        : Student( rozmiarKsiazki, rozmiarLicznik, rozmiarPrzedmioty )
    {
        srednia = new double[ semestr ];
    }
    ~Stud2st() {
        //delete[] srednia;
    }
public:
    std::string stopien;
    double * srednia;
public:
   
    friend std::istream & operator >>( std::istream & we, Stud2st & _stud2st ) {
        std::cout << std::endl;
        std::cout << "Podaj imie: ";
        we >> _stud2st.imie;
       
        std::cout << "Podaj nazwisko: ";
        we >> _stud2st.nazwisko;
       
        std::cout << "Podaj plec: ";
        we >> _stud2st.plec;
       
        std::cout << "Podaj wiek: ";
        we >> _stud2st.wiek;
       
        std::cout << "Podaj ulubione ksiazki: ";
        for( int i = 0; i < _stud2st.n; i++ ) {
            we >> _stud2st.ulubioneKsiazki[ i ];
        }
       
        std::cout << "Podaj numer indeksu: ";
        we >> _stud2st.indeks;
       
        std::cout << "Semestr: ";
        we >> _stud2st.semestr;
       
        std::cout << "Kierunek: ";
        we >> _stud2st.kierunek;
       
        std::cout << "Wydzial: ";
        we >> _stud2st.wydzial;
       
        std::cout << "Podaj ulubione przedmioty: ";
        for( int i = 0; i < _stud2st.ulubionePrzedmiotyRozmiar; i++ ) {
            we >> _stud2st.ulubionePrzedmioty[ i ];
        }
       
        std::cout << "Podaj stopien naukowy: ";
        we >> _stud2st.stopien;
       
        std::cout << "Podaj srednia z semestrow: ";
        for( int i = 0; i < _stud2st.semestr; i++ )
        {
            we >> _stud2st.srednia[ i ];
        }
       
        return we;
    }
   
    friend std::ostream & operator <<( std::ostream & wy, const Stud2st & _stud2st ) {
        wy << "Imie: " << _stud2st.imie << std::endl
        << "Nazwisko: " << _stud2st.nazwisko << std::endl
        << "Plec: " << _stud2st.plec << std::endl
        << "Wiek: " << _stud2st.wiek << std::endl
        << "Ulubione ksiazki: ";
        for( int i = 0; i < _stud2st.n; i++ ) {
            wy << _stud2st.ulubioneKsiazki[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Numer indeksu: " << _stud2st.indeks << std::endl
        << "Semestr: " << _stud2st.semestr << std::endl
        << "Kierunek: " << _stud2st.kierunek << std::endl
        << "Wydzial: " << _stud2st.wydzial << std::endl
        << "Ulubione przedmioty: ";
        for( int i = 0; i < _stud2st.ulubionePrzedmiotyRozmiar; i++ ) {
            wy << _stud2st.ulubionePrzedmioty[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Stopien naukowy: " << _stud2st.stopien << std::endl
        << "Srednia: ";
        for( int i = 0; i < _stud2st.semestr; i++ ) {
            wy << _stud2st.srednia[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Licznik obiektow: ";
        for( int i = 0; i < _stud2st.obiekty; i++ ) {
            wy << _stud2st.tablica[ i ] << std::endl;
           
        }
       
        return wy;
    }
   
   
};


class Doktorant
    : public Stud2st
     , public Prowadzacy
{
public:
    Doktorant()
        : Stud2st()
         , Prowadzacy()
    {
    }
    Doktorant( int rozmiarKsiazki, int rozmiarLicznik, int rozmiarPrzedmioty )
        : Stud2st( rozmiarKsiazki, rozmiarLicznik, rozmiarPrzedmioty )
         , Prowadzacy( rozmiarKsiazki, rozmiarLicznik )
    {
    }
    ~Doktorant() {
    }
public:
   
   
public:
    friend std::istream & operator >>( std::istream & we, Doktorant & _doktorant ) {
        std::cout << std::endl;
        std::cout << "Podaj imie: ";
        we >> _doktorant.imie;
       
        std::cout << "Podaj nazwisko: ";
        we >> _doktorant.nazwisko;
       
        std::cout << "Podaj plec: ";
        we >> _doktorant.plec;
       
        std::cout << "Podaj wiek: ";
        we >> _doktorant.wiek;
       
        std::cout << "Podaj ulubione ksiazki: ";
        for( int i = 0; i < _doktorant.n; i++ ) {
            we >> _doktorant.ulubioneKsiazki[ i ];
        }
       
        std::cout << "Podaj numer indeksu: ";
        we >> _doktorant.indeks;
       
        std::cout << "Semestr: ";
        we >> _doktorant.semestr;
       
        std::cout << "Kierunek: ";
        we >> _doktorant.kierunek;
       
        std::cout << "Wydzial: ";
        we >> _doktorant.wydzial;
       
        std::cout << "Podaj ulubione przedmioty: ";
        for( int i = 0; i < _doktorant.ulubionePrzedmiotyRozmiar; i++ ) {
            we >> _doktorant.ulubionePrzedmioty[ i ];
        }
       
        std::cout << "Podaj stopien naukowy: ";
        we >> _doktorant.stopien;
       
        std::cout << "Podaj liczbe publikacji: ";
        we >> _doktorant.publikacje;
       
        std::cout << "Podaj srednia z semestrow: ";
        for( int i = 0; i < _doktorant.semestr; i++ )
        {
            we >> _doktorant.srednia[ i ];
        }
       
        return we;
    }
   
    friend std::ostream & operator <<( std::ostream & wy, const Doktorant & _doktorant ) {
        wy << "Imie: " << _doktorant.imie << std::endl
        << "Nazwisko: " << _doktorant.nazwisko << std::endl
        << "Plec: " << _doktorant.plec << std::endl
        << "Wiek: " << _doktorant.wiek << std::endl
        << "Ulubione ksiazki: ";
        for( int i = 0; i < _doktorant.n; i++ ) {
            wy << _doktorant.ulubioneKsiazki[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Numer indeksu: " << _doktorant.indeks << std::endl
        << "Semestr: " << _doktorant.semestr << std::endl
        << "Kierunek: " << _doktorant.kierunek << std::endl
        << "Wydzial: " << _doktorant.wydzial << std::endl
        << "Ulubione przedmioty: ";
        for( int i = 0; i < _doktorant.ulubionePrzedmiotyRozmiar; i++ ) {
            wy << _doktorant.ulubionePrzedmioty[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Stopien naukowy: " << _doktorant.stopien << std::endl
        << "Liczba publikacji: " << _doktorant.publikacje << std::endl
        << "Srednia: ";
        for( int i = 0; i < _doktorant.semestr; i++ ) {
            wy << _doktorant.srednia[ i ] << ", ";
        }
        wy << std::endl;
        wy << "Licznik obiektow: ";
        for( int i = 0; i < _doktorant.obiekty; i++ ) {
            wy << _doktorant.tablica[ i ] << std::endl;
           
        }
       
        return wy;
    }
   
};



int main() {
   
    int ksiazki, przedmioty;
    int wielkosc = 1;
   
    cout << "Podaj wielkosc tablicy na ksiazki: " << endl;
    cin >> ksiazki;
   
    /*
             Czlowiek Czlowieczek(ksiazki, wielkosc);
             cin >> Czlowieczek;
             cout << Czlowieczek;
             */
    cout << "\nPodaj wielkosc tablicy na przedmioty: " << endl;
    cin >> przedmioty;
   
    /*    Student Studenciak1(ksiazki, wielkosc, przedmioty);
             cin >> Studenciak1;
             cout << Studenciak1;
      
             Prowadzacy Prowadzacy(ksiazki, wielkosc);
             cin >> Prowadzacy;
             cout << Prowadzacy;
      
             Stud2st Studenciak2(ksiazki, wielkosc, przedmioty);
             cin >> Studenciak2;
             cout << Studenciak2;
             */
   
    Doktorant Doktorant( ksiazki, wielkosc, przedmioty );
    cin >> Doktorant;
    cout << Doktorant;
   
    /*    Czlowieczek.~Czlowiek();
             Studenciak1.~Student();
             Prowadzacy.~Prowadzacy();
             Studenciak2.~Stud2st();
             */
   
    cin.sync();
    cin.get();
    cin.sync();
    cin.get();
    return 0;
}
P-147978
carlosmay
» 2016-05-06 12:24:19
Najprawdopodobniej wskaźnik, za pośrednictwem którego chcesz coś zapisać nie jest ustawiony (pusty).
P-147979
DejaVu
» 2016-05-06 12:35:54
Fatalnym pomysłem jest nazywać zmienne tak samo jak nazwy klas.
P-147980
darko202
» 2016-05-06 13:20:55
P-147981
DejaVu
» 2016-05-06 15:06:23
Dodam jeszcze: postaw breakpointa na początku programu i przesuwaj się nim po jednej linijce. Zawęzisz problem do jednej/dwóch problematycznych linijek.
P-147984
pekfos
» 2016-05-07 16:01:04
C/C++
Czlowiek() {
}
Czlowiek( int wielkoscKsiazki, int rozmiarLicznik ) {
    licznik++;
   
    n = wielkoscKsiazki;
    ulubioneKsiazki = new std::string[ n ];
   
    obiekty = rozmiarLicznik;
    tablica = new int[ obiekty ];
   
    for( int i = 0; i < obiekty; i++ ) {
        tablica[ i ] = licznik;
    }
   
}
Jaki sens ma ten domyślny konstruktor? W ogóle nic nie robi, dopuszczenie do wywołania go to błąd programisty.

C/C++
Doktorant( int rozmiarKsiazki, int rozmiarLicznik, int rozmiarPrzedmioty )
    : Stud2st( rozmiarKsiazki, rozmiarLicznik, rozmiarPrzedmioty )
     , Prowadzacy( rozmiarKsiazki, rozmiarLicznik )
{
}
I tu wywołujesz domyślny konstruktor Czlowiek, więc ta część klasy Doktorant nie jest zainicjalizowana.
P-148016
« 1 »
  Strona 1 z 1