c++ dodawanie argumentu do tablicy-problem

0

Witam,
mam program do napisania w którym muszę stworzyć samochód który przez clase fabryka go zmontuje i wrzuci do tablicy w klasie magazyn. I właśnie w ostatnim punkcie są schody gdyż wyrzuca mi błąd i w sumie nie bardzo wiem dlaczego. Przedstawię kod:

 #include <iostream>
#include <string>

using namespace std;

class kolo{
  private:
       int rozmiar;
       int wysokosc;
       int szerokosc;
       public:
void Wypelnij();
void Wyswietl(){
cout<<"rozmiar kola"<<rozmiar<<endl;
cout<<"wysokosc kola"<<wysokosc<<endl;
cout<<"szerokosc kola"<<szerokosc<<endl;
}
};

class rozmiar_auta{
    private:
int wysokosc;
int szerokosc;
int dlugosc;

public:
void Wypelnij();
void Wyswietl(){
cout<<"wysokosc auta"<<wysokosc<<endl;
cout<<"szerokosc auta"<<szerokosc<<endl;
cout<<"dlugosc auta"<<dlugosc<<endl;
}
};

class wyposazenie{
private:
string kolor;
string klimatyzacja;
string el_szyby;
string rodzaj_tapicerki;
public:
void Wypelnij();
void Wyswietl(){
cout<<"Ma klimatyzacje:"<<klimatyzacja<<endl;
cout<<"Kolor: "<<kolor<<endl;
cout<<"Elektryczne szyby: "<<el_szyby<<endl;
cout<<"Rodzaj tapicerki: "<<rodzaj_tapicerki<<endl;
}
};

class info_producenta{
private:
string marka;
string model;
public:
void Wypelnij();
void Wyswietl(){
cout<<"Marka: "<<marka<<endl;
cout<<"Model: "<<model<<endl;
}
};

class info{
private:
string r_nadwozia;
string r_paliwa;
double pojemnosc;
int moc;
public:
void Wypelnij();
void Wyswietl(){
cout<<"Rodzaj nadwozia: "<<r_nadwozia<<endl;
cout<<"Rodzaj paliwa: "<<r_paliwa<<endl;
cout<<"Pojemnosc"<<pojemnosc<<endl;
cout<<"Moc: "<<moc<<endl;
}
};

class samochod:info_producenta,info, wyposazenie,kolo, rozmiar_auta
{
public:

void wyswietls(){
    ip->Wyswietl();
    in->Wyswietl();
    wy->Wyswietl();
    ra->Wyswietl();
ko->Wyswietl();
}
void ins(){
in = new info();
in->Wypelnij();
}
void ips(){
ip = new info_producenta();
ip->Wypelnij();
}
void wys(){
wy = new wyposazenie();
wy->Wypelnij();
}
void kos(){
ko = new kolo();
ko->Wypelnij();
}
void ras(){
ra = new rozmiar_auta();
ra->Wypelnij();
}
private:
info_producenta *ip;
info *in;
wyposazenie *wy;
kolo *ko;
rozmiar_auta *ra;
};

class magazyn
{
    private:
    samochod* tab;
public:

int x;
magazyn() {
tab = new samochod[10];
x=0;
}

   void add(samochod *s){
      tab[x]=s;// W tym miejscu się wykrzacza cos z operatorem przypisania
        x++;
   }

    void wyswietlm(){
    int i;
    for(i=0;i<x;i++){
    tab[i].wyswietls();
    }
    }
};

class fabryka
{
public:
magazyn m;
void addcar(samochod *s){
m.add(s);
}
};


void wyposazenie::Wypelnij()
{
    cout << "Podaj kolor auta: ";
    cin >> kolor;
    cout << "Czy posiade klimatyzacje T/N?: ";
    cin >> klimatyzacja;
    cout << "Czy posiade elektryczne szyby T/N?: ";
    cin >> el_szyby;
    cout << "Rodzaj tapicerki: ";
    cin >> rodzaj_tapicerki;
}


void rozmiar_auta::Wypelnij()
{
    cout << "Podaj wysokosc auta: ";
    cin >> wysokosc;
    cout << "Podaj szerokosc auta: ";
    cin >> szerokosc;
    cout << "Podaj dlugosc auta: ";
    cin >> dlugosc;

}

void info_producenta::Wypelnij()
{
    cout << "Podaj marke auta: ";
    cin >> marka;
    cout << "Podaj model auta: ";
    cin >> model;

}

void info::Wypelnij()
{
    cout << "Podaj rodzaj nadwozia auta: ";
    cin >> r_nadwozia;
    cout << "Podaj rodzaj paliwa auta: ";
    cin >> r_paliwa;
    cout << "Podaj pojemnosc auta: ";
    cin >> pojemnosc;
    cout << "Podaj moc auta: ";
    cin >> moc;

}
void kolo::Wypelnij()
{
    cout << "Podaj rozmiar kola: ";
    cin >> rozmiar;
    cout << "Podaj wysokosc opony: ";
    cin >> wysokosc;
    cout << "Podaj szerokosc opony: ";
    cin >> szerokosc;
}
int menu()
{
	int z;
        cout<<"MENU:\n"<<endl;
    	cout<<"1-Dodaj Marka/Model\n"<<endl;;
        cout<<"2-Dodaj info silnik/nadwozie\n"<<endl;
        cout<<"3-Dodaj wyposazenie\n"<<endl;
        cout<<"4-Dodaj kola\n"<<endl;
        cout<<"5-Dodaj wymiary auta\n"<<endl;
        cout<<"6-Montuj auto\n"<<endl;
        cout<<"7-Pokaz stan magazynu\n"<<endl;;
        cout<<"8-koniec programu\n"<<endl;;
	cout<<"Twoj wybor: "<<endl;;
        cin>>z;
        return z;
}

int main()
{
    int z;
    samochod samochod;
    fabryka f;
    magazyn m;
    poczatek:
                z=menu();
                switch(z)
                {
                case 1:
                samochod.ips();
                goto poczatek;
		        case 2:
		        samochod.ins();
		        goto poczatek;
		        case 3:
		        samochod.wys();
		        goto poczatek;
		        case 4:
		        samochod.kos();
		        goto poczatek;
		        case 5:
		        samochod.ras();
                goto poczatek;
                case 6:
                f.addcar(&samochod);
                goto poczatek;
                case 7:
                m.wyswietlm();
                goto poczatek;
                }

    return 0;
}
0

To jest jakaś tragedia. I logiczna i programistyczna.

  1. class samochod:info_producenta,info, wyposazenie,kolo, rozmiar_auta ? WTF? Czy samochód jest szczególnym przypadkiem koła? albo rozmiaru_auta? albo info_producenta? NIE. Samochód się z tych elementów SKŁADA. Lekcja na dziś: agregacja i kompozycja zamiast generalizacji
  2. Za goto w main() powinieneś dostać zakaz używania komputera, tym bardziej ze jeden głupi do..while() by to załatwił
  3. Tworzysz tablicę OBIEKTÓW a potem próbujesz wpisać do komórki tej tablicy WSKAŹNIK. Widzisz różnicę?
0

Czyli muszę najlepiej utworzyć tablice wskaźników, ale wtedy z kolei mi się wykrzacza w:

    tab[i].wyswietls(); 

bo tutaj używam znowu obiektu. I teraz nie wiem czy nie zostawić tablicy obiektów i nie zmienić tego wskaźnika na obiekty(o zgrozo łatwiej powiedzieć to niż zrobić:/)
A za to goto to już sobie sam dam karę.

edit.
jestem idiotą, wystarczyło dać tab[i]->wyswietls(); tylko teraz znowu się wywala przy wybraniu opcji wyświetlania w case. Tylko nie ma żadnych błędów:/

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