• 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
461 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 18 października 2020 przez j23 Mędrzec (194,920 p.)
  //takie podejscie??
    Samochod* first = nullptr;
    Osobowy* pOsobowy = nullptr;
    Dostawczy* pDostawczy = nullptr;
    Ciezarowy* pCiezarowy = nullptr;
    Autobus* pAutobus = nullptr;

Po co tyle tych wskaźników, skoro wszystkie samochody dziedziczą po Samochod?

  //Czy to dobry sposob???
    void kupSamochod(Samochod* pHead,Osobowy* Head )

Nie. Wystarczy jeden wskaźnik na Samochod. Korzystaj z polimorfizmu.

komentarz 19 października 2020 przez kaminie318 Bywalec (2,070 p.)
Okej, polimorfizm co prawda nie jest wymagany ale postaram się coś zrobić.Co do tych wskaźników to nie wiem jak inaczej przekazać wskaźnik na główną listę zawierającą typy aut, co więcej każde auto ma osobne atrybuty więc chyba tyle wskaźników jest potrzebne aby się odwołać. Bardziej chodziło mi o maina, dlaczego nie chce wyświetlać tam elementu listy oraz dlaczego dwa razy dane są przypisywane do obiektu parametry.
komentarz 19 października 2020 przez j23 Mędrzec (194,920 p.)

co więcej każde auto ma osobne atrybuty więc chyba tyle wskaźników jest potrzebne aby się odwołać.

I co, dla każdego typu samochodu będziesz implementował oddzielne metody dodawania/usuwania/listowania? Po to jest polimorfizm, by tego typu rzeczy nie robić.

dlaczego nie chce wyświetlać tam elementu listy

Dlatego, że klasa Osobowy ma swój wskaźnik next, a pokazListeSamochodow używa wskaźnika klasy Samochod.

Nie widzę też sensu klas ParametrySamochoduOsobowego, ParametrySamochoduDostawczego, ParametrySamochoduCiezarowego i ParametryAutobusu. Skoro implementujesz klasy pochodne od Samochod, to po co jeszcze dodatkowe klasy trzymające parametry tych różnych typów samochodów? Nie możesz trzymać parametrów w klasach pochodnych?

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

Mam prośbę, dałbyś radę poprawić lub zakomentować te fragmenty kodu które według ciebie są źle? Po twoich uwagach mam wrażenie że całość kodu jest bez sensu, a chciałbym mieć chociaż dobre fundamenty. To co mam aktualnie, trochę pozmieniałem. Mogę parametry samochodu wrzucić po prostu do klasy samochód? Nie musi być to napisane perfekcyjnie, chcę żeby działało.

#include <iostream>

using namespace std;

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

int ParametrySamochodu::saldoSalonu = 0;

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


class Osobowy : public Samochod
{
public:
    int iloscDrzwi;
    float wielkoscBagaznika;
    bool fotelikDlaDziecka;
    Osobowy* next = nullptr;

public:
    void kupSamochodOsobowy(Osobowy* samochod)
    {

    }
};

class Dostawczy: public Samochod
{
public:
    int dozwolonaMasaWlasnaKatB;
    bool kurnik;
};

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

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

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;

    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)
        {
            this->first = n;
        }

    }
    
    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 =new 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 = new Osobowy( 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;
}

Dzięki za chęć pomocy.

P.S Czy muszę tworzyć obiekty w konstruktorze? Metody są dla mnie wygodniejsze. Nie mogę po prostu utworzyć metody w klasie samochód "kup samochód" i tam dodawać do listy? 

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

*EDIT polimorfizm jest genialny, zmieniłem na coś takiego. Masz pomysł jak dodać obiekt do mojej listy ? 

#include <iostream>

using namespace std;

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

int ParametrySamochodu::saldoSalonu = 0;

class Samochod
{
public:
	ParametrySamochodu podstawoweParametry;
	Samochod* next = nullptr;
	virtual void kupSamochod() = 0;
	//virtual void sprzedajSamochod() = 0;
	//virtual void wykupSamochodOdKlienta() = 0;
	//virtual void wyswietlListeSamochodow() = 0;
	//
};


class Osobowy : public Samochod
{
public:
	int iloscDrzwi;
	float wielkoscBagaznika;
	bool fotelikDlaDziecka;
	Osobowy* next = nullptr;

public:
	virtual void kupSamochod()
	{
		cout << "Wprowadz dane pojazdu: " << endl;
		cout << "Marka: "; cin >> podstawoweParametry.marka;
		cout << "Model: "; cin >> podstawoweParametry.model;
		cout << "Cena: "; cin >> podstawoweParametry.cena;
		cout << "Rok produkcji: "; cin >> podstawoweParametry.rokProdukcji;
		cout << "Pojemnosc: "; cin >> podstawoweParametry.pojemnosc;
		cout << "Przebieg: "; cin >> podstawoweParametry.przebieg;
		cout << "Moc: "; cin >> podstawoweParametry.moc;
		cout << "iloscDrzwi: "; cin >> iloscDrzwi;
		cout << "wielkoscBagaznika: "; cin >> wielkoscBagaznika;
		cout << "fotelikDlaDziecka: "; cin >> fotelikDlaDziecka;
		podstawoweParametry.saldoSalonu -= podstawoweParametry.cena;
	}
};

class Dostawczy: public Samochod
{
public:
	int dozwolonaMasaWlasnaKatB;
	bool kurnik;
};

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

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

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:
	Samochod* first = 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 dodajDoListy(Samochod* pHead)
	{
		//nie wiem jak dodać do listy 
		Samochod* nowy = new Samochod;
		if (this->size()==0)
		{
			this->first = nowy;
			this->first->next = nullptr;
		}
		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->next;
		}
	}

	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;

	ListaJednokierunkowa* myList = new ListaJednokierunkowa;
	myList->pokazListeSamochodow();
	Samochod* sam =  nullptr;
	Samochod* wsk;
	Osobowy os;
	wsk = &os;
	wsk->kupSamochod();
	myList->dodajDoListy(wsk);
	myList->pokazListeSamochodow();

	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 j23 Mędrzec (194,920 p.)
edycja 19 października 2020 przez j23

Popraw metodę dodającą:

void kupSamochod(Samochod* s)
{
    if (first == nullptr) {
        first = s;
        return;
    }
    
    Samochod* p = first;
    while (p->next) { p = p->next; }
    p->next = s;
}



// użycie
myList->kupSamochod(new Dostawczy);
myList->kupSamochod(new Osobowy);
myList->kupSamochod(new Autobus);

Dobrze by było, gdyby ListaJednokierunkowa miała jeszcze wskaźnik tail, by nie trzeba było co każde dodanie przewijać listy na koniec. Podumaj jak to zrobić. Obiekt, który podajesz w parametrze, jest dołączany do listy, więc nie możesz go tworzyć na stosie.

Lepiej byłoby zrobić coś takiego:

template<typename T>
void kupSamochod(T && s)
{
    if (first == nullptr) {
        first = new T(std::forward<T>(s));
        return;
    }

    Samochod* p = first;
    while (p->next) { p = p->next; }
    p->next = new T(std::forward<T>(s));
}

//użycie
myList.kupSamochod(Dostawczy());
myList.kupSamochod(Ciezarowy());
myList.kupSamochod(Autobus());

Obiekty podane w parametrze są kopiowane/przenoszone. Jest to rozwiązanie bezpieczniejsze.

Wywal next z Osobowy.

Do Samochod dodaj wirtualny destruktor (może być pusty).

ListaJednokierunkowa też powinna mieć destruktor usuwający listę.

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

Początkowo był wskaźnik na ogon, ale go usunąłem gdyż stwierdziłem że jest zbędny w listach jednokierunkowych. Próbuję wyświetlać wyniki na ekran, ale konsola pokazuje tylko zera w ilości zależnej od dodanych obiektów. Co może być nie tak?  Co do usuwania, chciałbym usuwać po numerze auta w salonie więc powinienem zostawić tą funkcję usuwającą względem pozycji czy kombinować z czymś nowym?

	void pokazListeSamochodow()
	{
		Samochod* temp = this->first;
		if (this->first == nullptr)
		{
			cout << "Nie masz zadnych aut!" << endl;
		}
		while (temp != nullptr)
		{
			cout << temp->podstawoweParametry.numerSamochodu;
			cout << temp->podstawoweParametry.marka;
			cout << temp->podstawoweParametry.model;
			//itd..
			//ale jak tu zrobic wyswietlanie w zaleznosci od typu auta? 
			temp = temp->next;
		}
	}

 

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

//ale jak tu zrobic wyswietlanie w zaleznosci od typu auta?

Wykorzystaj polimorfizm ;) Dodaj do Samochod metodę wirtualną printInfo (może być pusta) i zaimplementuj ją w każdej klasie pochodnej tak, by wyświetlała odpowiednie dane.

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

Zrobiłem tak i działa, ale wyświetla same zera, zapewne muszę dodać parametr klasy samochód do parametrów funkcji? (chociaż według mnie wygląda to okej) Zatem jaki argument w mainie dodać potem :/ 

	void pokazListeSamochodow()
	{
		Samochod* temp = this->first;
		if (this->first == nullptr)
		{
			cout << "Nie masz zadnych aut!" << endl;
		}
		while (temp != nullptr)
		{
			temp->wyswietlListeSamochodow();
			temp = temp->next;
		}
	}

 

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

Ciężko powiedzieć, dlaczego wyświetla same zera. Nie wiem, jak zaimplementowałeś wyswietlListeSamochodow, jak dodajesz samochody do listy.

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ź 843 wizyt
0 głosów
2 odpowiedzi 214 wizyt
pytanie zadane 13 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)

92,669 zapytań

141,567 odpowiedzi

320,033 komentarzy

62,034 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!

...