• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista jednokierunkowa obiektowo

Object Storage Arubacloud
0 głosów
421 wizyt
pytanie zadane 18 października 2020 w C i C++ przez kaminie318 Bywalec (2,070 p.)

Czy jest ktoś wstanie wskazać lub poprawić mi błąd w funkcji "kupSamochod" ? Nie wiem dlaczego podczas wywoływania program się wysypuje. Chciałbym jeszcze zapytać dlaczego wartości obiektu parametry wpisywane są dwa razy. Użytkownik na forum wskazał mi to rozwiązanie nie rozumiem dlaczego. Dopiero zacząłem programować obiektowo i już mam zrobić projekt wobec czego proszę o wyrozumiałość. 

#include <iostream>

using namespace std;

class ParametrySamochodu
{
private:
	static int saldoSalonu;
public:
	string marka, model;
	int cena, rokProdukcji, pojemnosc, przebieg, moc;
};

int ParametrySamochodu::saldoSalonu = 0;

class Samochod
{
public:
	ParametrySamochodu podstawoweParametry;
	Samochod* next = nullptr;

public:
	Samochod(const ParametrySamochodu& podstawoweParametry_) : podstawoweParametry{ podstawoweParametry_ } {}
};

class ParametrySamochoduOsobowego
{
public:
	int iloscDrzwi;
	float wielkoscBagaznika;
	bool fotelikDlaDziecka;
};

class ParametrySamochoduDostawczego
{
public:
	int dozwolonaMasaWlasnaKatB;
	bool kurnik;
};

class ParametrySamochoduCiezarowego
{
public:
	float dopuszczalnaDlugoscNaczepy;
	int iloscNaczep;
	bool zimoweLancuchyNaKola;
};

class ParametryAutobusu
{
public:
	int miejscaStojace, miejscaSiedzace;
	bool przewozOsobNiepelnosprawnych;
};

class Osobowy : public Samochod
{
public:
	ParametrySamochoduOsobowego dodatkoweParametry;
	Osobowy* next = nullptr;

public:
	Osobowy(const ParametrySamochodu& podstawoweParametry_, const ParametrySamochoduOsobowego& dodatkoweParametry_)
		: Samochod{ podstawoweParametry_ }, dodatkoweParametry{ dodatkoweParametry_ } {}
};

class Dostawczy: public Samochod
{
private:
	ParametrySamochoduDostawczego dodatkoweParametry;

public:
	Dostawczy(const ParametrySamochodu& podstawoweParametry_, const ParametrySamochoduDostawczego& dodatkoweParametry_)
		: Samochod{ podstawoweParametry_ }, dodatkoweParametry{ dodatkoweParametry_ } {}

};

class Ciezarowy:public Samochod
{
private:
	ParametrySamochoduCiezarowego dodatkoweParametry;

public:
	Ciezarowy(const ParametrySamochodu& podstawoweParametry_, const ParametrySamochoduCiezarowego& dodatkoweParametry_)
		: Samochod{ podstawoweParametry_ }, dodatkoweParametry{ dodatkoweParametry_ } {}
};

class Autobus :public Samochod
{
private:
	ParametryAutobusu dodatkoweParametry;

public:
	Autobus(const ParametrySamochodu& podstawoweParametry_, const ParametryAutobusu& dodatkoweParametry_)
		: Samochod{ podstawoweParametry_ }, dodatkoweParametry{ dodatkoweParametry_ } {}
};

class Data
{
private:
	int dzien;
	int miesiac;
	int rok;

public:
	void pobierzDate()
	{
		cout << "Podaj date zakupu/sprzedazy samochodu: " << endl;
		cout << "Dzien: ";
		cin >> dzien;
		cout << "Miesiac: ";
		cin >> miesiac;
		cout << "Rok: ";
		cin >> rok;
	}
	void wyswietlDate()
	{	
		if (dzien < 10)
		{
			cout << '0';
		}
		cout << dzien << ".";

		if (miesiac < 10) 
		{
			cout << "0";
		}
		cout << miesiac << ".";

		cout << rok << endl;
	}
};

void menu()
{
	puts("Witaj w systemie salonu samochodowego!\n"
		 "Wybierz opcje:\n"
		 "1.Kup samochod\n"
		 "2.Sprzedaj samochod\n"
		 "3.Wykup samochod od klienta w rozliczeniu\n"
		 "4.Wyswietl obecne auta w salonie\n"
		 "5.Zamknij salon\n");
}

void rodzajSamochodu()
{
	puts("Podaj przeznaczenie pojazdu: \n"
		 "1.Osobowy\n"
		 "2.Dostawczy\n"
		 "3.Ciezarowy\n"
		 "4.Autobus\n");
}

//class Element
//{
//public:
//	int data = 0;
//	Element* next;
//	Element(int d)
//	{
//		this->data = d;
//		this->next = nullptr;
//	}
//};

class ListaJednokierunkowa
{
public:
	//Element* first = nullptr;

	//takie podejscie??
	Samochod* first = nullptr;
	Osobowy* pOsobowy = nullptr;
	Dostawczy* pDostawczy = nullptr;
	Ciezarowy* pCiezarowy = nullptr;
	Autobus* pAutobus = nullptr;

	Samochod* znajdzSamochod(int pozycja)
	{
		if(pozycja<1 || pozycja>this->size())
		{
			return nullptr;
		}
		Samochod* temp = this->first;
		int i = 1;
		while (i++<pozycja)
		{
			temp = temp->next;
		}
		return temp;
	}

	//dodajDoListy
	//Czy to dobry sposob???
	void kupSamochod(Samochod* pHead,Osobowy* Head )//bedzie tu piec argumentow kazdego rodzaju samochodu
	{
		ParametrySamochodu parametry;
		ParametrySamochoduOsobowego dodatkoweParametry;

		Samochod* n = new Samochod(parametry);
		if (this->size()==0)
		{
			//nie wiem jak korzystać tu z konstruktora do tworzenia obiektu 
			this->first = n;
			//itd...
		}
		else
		{

		}

	}
	
	void pokazListeSamochodow()
	{
		Samochod* temp = this->first;
		////////////////////////
		if (this->first == nullptr)
		{
			cout << "Nie masz zadnych aut!" << endl;
		}
		///////////
		while (temp != nullptr)
		{
			cout << temp->podstawoweParametry.marka;
			//itd..
			//temp = temp->;
		}
	}

	bool sprzedajSamochod(int pozycja)
	{
		if (this->size() == 0)
		{
			return false;
		}

		//nieistniejacy element
		if (pozycja > this->size() || pozycja == 0)
		{
			cout << "Usuwasz nieistniejacy pojazd!" << endl;
			return false;
		}

		//jedyny element
		if (this->size() == 1)
		{
			delete this->first;
			this->first = nullptr;
		}

		//pierwszy, ale nie ostatni
		else if (pozycja == 1)
		{
			Samochod* temp = this->first;
			this->first = this->first->next;
			delete temp;
		}

		//ostatni, ale nie jedyny
		else if (pozycja == this->size())
		{
			Samochod* before = this->znajdzSamochod(pozycja - 1);
			delete before->next;
			before->next = nullptr;
		}

		//gdzies w srodku
		else
		{
			Samochod* before =this-> znajdzSamochod(pozycja - 1);
			Samochod* temp = this->znajdzSamochod(pozycja);
			before->next = temp->next;
			delete temp;
		}
		return true;
	}

	//zlicza elementy
	int size()
	{
		int i = 0;
		Samochod* temp = this->first;
		while (temp != nullptr)
		{
			i++;
			temp = temp->next;
		}
		return i;
	}
};



int main()
{
	//menu();
	int wybor;
	//Samochod* pGlowa = nullptr;
	//Samochod* temp = new Samochod;

	ListaJednokierunkowa* myList = new ListaJednokierunkowa;
	myList->pokazListeSamochodow();

	ParametrySamochodu parametry;
	ParametrySamochoduOsobowego dodatkoweParametry;

	//Czy pisanie tego dwa razy jest potrzebne ?
	cout << "Wprowadz dane pojazdu: " << endl;
	cout << "Marka: "; cin >> parametry.marka;
	cout << "Model: "; cin >> parametry.model;
	cout << "Cena: "; cin >> parametry.cena;
	cout << "Rok produkcji: "; cin >> parametry.rokProdukcji;
	cout << "Pojemnosc: "; cin >> parametry.pojemnosc;
	cout << "Przebieg: "; cin >> parametry.przebieg;
	cout << "Moc: "; cin >> parametry.moc;

	Samochod samochod{ parametry };

	cout << "Wprowadz dane pojazdu: " << endl;
	cout << "Marka: "; cin >> parametry.marka;
	cout << "Model: "; cin >> parametry.model;
	cout << "Cena: "; cin >> parametry.cena;
	cout << "Rok produkcji: "; cin >> parametry.rokProdukcji;
	cout << "Pojemnosc: "; cin >> parametry.pojemnosc;
	cout << "Przebieg: "; cin >> parametry.przebieg;
	cout << "Moc: "; cin >> parametry.moc;
	cout << "iloscDrzwi: "; cin >> dodatkoweParametry.iloscDrzwi;
	cout << "wielkoscBagaznika: "; cin >> dodatkoweParametry.wielkoscBagaznika;
	cout << "fotelikDlaDziecka: "; cin >> dodatkoweParametry.fotelikDlaDziecka;

	Osobowy samochodOsobowy( parametry,dodatkoweParametry );

	Osobowy o(parametry, dodatkoweParametry);
	//o.podstawoweParametry.marka

	// teraz mam dodac do listy samochod

	myList->kupSamochod(&samochod, &samochodOsobowy);
	myList->pokazListeSamochodow();

	// List moja_lista_samochodow;
	// moja_lista_samochodow.append(samochod);
	// moja_lista_samochodow.append(samochodOsobowy);


	do
	{
		cout << "Wybor: ";
		cin >> wybor;
		switch (wybor)
		{
		case 1:
			//rodzajSamochodu();
			//temp->dodajPojazd(pGlowa);
			//kup
			break;
		case 2:
			//sprzedaj
			break;
		case 3:
			//wykup od klienta rozliczenie
			break;
		case 4:
			//wyswietl flote
			//temp->pokazPosiadanePojazdy(pGlowa);
			break;
		case 5:
			cout << "Wychodzisz z salonu" << endl;
			break;
		default:
			cout << "Nie ma takiego wyboru. Wybierz jeszcze raz" << endl;
			break;
		}
	} while (wybor != 5);
	//delete temp;
	return 0;
}

 

komentarz 19 października 2020 przez kaminie318 Bywalec (2,070 p.)

dla osobowego:

	virtual void wyswietlListeSamochodow()
	{	
		cout << "Pojazd nr: " << podstawoweParametry.numerSamochodu << endl;
		cout << "Marka: " << podstawoweParametry.marka << endl;
		cout << "Model: " << podstawoweParametry.model << endl;
		cout << "Cena: " << podstawoweParametry.cena << endl;
		cout << "Rok produkcji: " << podstawoweParametry.rokProdukcji << endl;
		cout << "Pojemnosc: "<< podstawoweParametry.pojemnosc << endl;
		cout << "Przebieg: " << podstawoweParametry.przebieg << endl;
		cout << "Moc: " << podstawoweParametry.moc << endl;
		cout << "iloscDrzwi: " << iloscDrzwi << endl;
		cout << "wielkoscBagaznika: " << wielkoscBagaznika << endl;
		cout << "fotelikDlaDziecka: " << fotelikDlaDziecka << endl << endl;
	}

 

komentarz 19 października 2020 przez j23 Mędrzec (194,920 p.)
edycja 19 października 2020 przez j23

podstawoweParametry są polem klasy Samochod, więc logiczniej byłoby, gdyby wyświetlanie jego zawartości przenieść do metody Samochod::wyswietlListeSamochodow. Wtedy zamiast powielać w każdej klasie pochodnej fragment:

cout << "Pojazd nr: " << podstawoweParametry.numerSamochodu << endl;
cout << "Marka: " << podstawoweParametry.marka << endl;
cout << "Model: " << podstawoweParametry.model << endl;
cout << "Cena: " << podstawoweParametry.cena << endl;
cout << "Rok produkcji: " << podstawoweParametry.rokProdukcji << endl;
cout << "Pojemnosc: "<< podstawoweParametry.pojemnosc << endl;
cout << "Przebieg: " << podstawoweParametry.przebieg << endl;
cout << "Moc: " << podstawoweParametry.moc << endl;

dać jedynie:

Samochod::wyswietlListeSamochodow();

Niech każda klasa odpowiada (w miarę możliwości) za swoje klamoty.

 

BTW jaki jest pożytek z klasy ParametrySamochodu? Nie możesz po prostu przenieść jej pól do klasy Samochod?

No i dlaczego taka nazwa metody, przecież ona nie wyświetla żadnej listy?

komentarz 19 października 2020 przez kaminie318 Bywalec (2,070 p.)

Niby tak ale wtedy równie dobrze można funkcję kupSamochód tak podzielić. Nie wiem czy jest to konieczny zabieg, nie załatwia to błędów wyświetlania, a jedynie teraz podkreśla mi ListeParametrowPodstawowych  :/ Tak poza tym to klasa osobowy nie będzie dziedziczyć tej funkcji? 

//klasa Osobowy	
Samochod::wyswietlListeParametrowPodstawowychSamochodow() ;
	virtual void wyswietlListeParametrowDodatkowychSamochodow()
	{
		cout << "iloscDrzwi: " << iloscDrzwi << endl;
		cout << "wielkoscBagaznika: " << wielkoscBagaznika << endl;
		cout << "fotelikDlaDziecka: " << fotelikDlaDziecka << endl << endl;
	}

 

komentarz 19 października 2020 przez antekelektronik Obywatel (1,120 p.)

@kaminie318,  fajny kod

 

komentarz 22 października 2020 przez Eriss69 Gaduła (4,470 p.)

@kaminie318, taka rada zrob oddzielny pliczek z 'class' bo troche tego jest a tak to kod bedzie czytelniejszy. Pozdrawiam

1 odpowiedź

+1 głos
odpowiedź 19 października 2020 przez j23 Mędrzec (194,920 p.)
wybrane 26 października 2020 przez kaminie318
 
Najlepsza

--- Kontynuacja wątku z komentarzy ---

Niby tak ale wtedy równie dobrze można funkcję kupSamochód tak podzielić.

Odnośnie czego to?

Tak ma być (zwróć uwagę, że nazwałem metodę zgodnie z jej przeznaczeniem):

class Samochod
{
    ...
    virtual void pokazDane() const 
    {
        cout << "Pojazd nr: " << podstawoweParametry.numerSamochodu << '\n';
        cout << "Marka: " << podstawoweParametry.marka << '\n';
        cout << "Model: " << podstawoweParametry.model << '\n';
        cout << "Cena: " << podstawoweParametry.cena << '\n';
        cout << "Rok produkcji: " << podstawoweParametry.rokProdukcji << '\n';
        cout << "Pojemnosc: "<< podstawoweParametry.pojemnosc << '\n';
        cout << "Przebieg: " << podstawoweParametry.przebieg << '\n';
        cout << "Moc: " << podstawoweParametry.moc << '\n';
    }
};

class Osobowy : public Samochod
{
    ...
        
    void pokazDane() const override
    {
        Samochod::pokazDane(); // <--- wywołanie metody klasy bazowej
        cout << "iloscDrzwi: " << iloscDrzwi << '\n';
        cout << "wielkoscBagaznika: " << wielkoscBagaznika << '\n';
        cout << "fotelikDlaDziecka: " << fotelikDlaDziecka << '\n';
    }
};

Analogicznie robisz dla reszty klas pochodnych.

komentarz 2 listopada 2020 przez j23 Mędrzec (194,920 p.)
Wiesz, dlaczego to zadziałało?
komentarz 2 listopada 2020 przez kaminie318 Bywalec (2,070 p.)
edycja 2 listopada 2020 przez kaminie318
Wyczytałem że to ws to manipulator, ignoruje białe znaki do momentu napotkania znaczącego. Wygląda na to, że tamten getline wczytywał biały znak.
1
komentarz 2 listopada 2020 przez j23 Mędrzec (194,920 p.)

Chodzi o to, że przed użyciem getline użyty jest operator >> do czytania liczby. Ten operator kończy czytać ze strumienia w momencie, gdy znak nie pasuje do formatu liczby (np. nie jest cyfrą). Kiedy użytkownik poda liczbę i naciśnie enter, operator przeczyta wszystkie cyfry i zostawi znak końca linii w strumieniu, co getline potraktuje jako pustą linię. Dlatego funkcja nie czekała na podanie przez użytkownika nazwy marki. Manipulator usuwa ten problematyczny znak końca linii.

komentarz 5 listopada 2020 przez kaminie318 Bywalec (2,070 p.)

Ostatnie pytanie, wytłumaczysz mi tą linię? Pogubiłem się w tych wskaźnikach.

if ((next->*comp)(*p))

Dlaczego tu jest ampersand przed Samochod? Powód to działanie na oryginalnym obiekcie? Trochę mieszam się z ampersandami w operatorach.

comp = &Samochod::operator<;

 

1
komentarz 5 listopada 2020 przez j23 Mędrzec (194,920 p.)
edycja 5 listopada 2020 przez j23

Powód to działanie na oryginalnym obiekcie?

Tu nie ma żadnego obiektu. Po prostu przypisuje adres operatora < do zmiennej (comp jest wskaźnikiem na metodę).

Podobne pytania

–1 głos
1 odpowiedź 194 wizyt
pytanie zadane 24 października 2019 w C i C++ przez Adrian Kłos Nowicjusz (120 p.)
0 głosów
1 odpowiedź 838 wizyt
0 głosów
2 odpowiedzi 210 wizyt
pytanie zadane 13 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)

92,661 zapytań

141,557 odpowiedzi

320,000 komentarzy

62,028 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...