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? #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() { } 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() { } 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() { } 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; cout << "\nPodaj wielkosc tablicy na przedmioty: " << endl; cin >> przedmioty; Doktorant Doktorant( ksiazki, wielkosc, przedmioty ); cin >> Doktorant; cout << Doktorant; cin.sync(); cin.get(); cin.sync(); cin.get(); return 0; } |
|
carlosmay |
» 2016-05-06 12:24:19 Najprawdopodobniej wskaźnik, za pośrednictwem którego chcesz coś zapisać nie jest ustawiony (pusty). |
|
DejaVu |
» 2016-05-06 12:35:54 Fatalnym pomysłem jest nazywać zmienne tak samo jak nazwy klas. |
|
darko202 |
» 2016-05-06 13:20:55 |
|
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. |
|
pekfos |
» 2016-05-07 16:01:04 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. 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. |
|
« 1 » |