Baza danych obiektowo C++

0

Cześć. Dopiero zacząłem programowanie obiektowe i muszę już napisać projekt, chodzi o krótką bazę danych salonu samochodowego, jednak wykorzystującą znaczną część obiektowości. Potrzebuję pomocy z kilkoma rzeczami. Chcę zaimplementować dwie listy jednokierunkowe reprezentującą samochody i wskaźniki na konkretne typy aut do funkcji dodajSamochod. Znalazłem fajnie wytłumaczoną implementację listy na internecie. Mam kilka pytań co do dalszego rozwiązywania. Jest to wersja bardzo robocza.

  1. Proszę o zerknięcie na funkcję "dodajSamochod"(reszta funkcji to pozostałość do przerobienia po klasie Element) Czy mój tok rozumowania jest słuszny? Ewentualnie proszę o implementacje tej funkcji, z resztą powinienem dać radę bazując na tej. Wydaje mi się że powinienem używać wskaźników this co sugeruje mi że jestem w błędzie. Czy powinienem wrzucać pięć parametrów do funkcji(Samochod, Osobowy, Cięzarowy...) ?
  2. Czy konieczne jest pisanie dwa razy w mainie podstawowych parametrów pojazdu ? Czy mogę utworzyć jakąś funkcję biorącą te dane?
  3. Chyba nieumiejętnie korzystam z hermetyzacji, czy da się to jakoś ulepszyć? Wydaje mi się że cały czas jestem zmuszony do etykiety public bo inaczej pola są nieaktywne.
  4. W której klasie zaprzyjaźnić klasę Data albo jak lepiej to zrobić aby wprowadzać daty zakupów pojazdów? W dacie mam zamienić funkcję na konstruktor ?
  5. Czy da się jakoś wykorzystać tutaj przeciążony operator np. dodawania ?(myślę o zliczaniu aktualnego salda salonu, ale wtedy chyba niezbędne są operatory "+" i "-")
    Proszę o wyrozumiałość i pozdrawiam.
#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;

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;

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;

	//chyba zrezygnuje z last, program bedzie na listach jednokierunkowych
	Element* last = nullptr;

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

	//czy takie???
	Samochod* head = nullptr;
	Samochod* nowySamochod = nullptr;
	Osobowy* pHead = nullptr;
	Osobowy* nowyOsobowy = nullptr;


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

	//dodajDoListy
	//Czy to dobry sposob???
	void dodajSamochod(Samochod* pHead,Osobowy* Head )//bedzie tu piec argumentow kazdego rodzaju samochodu
	{
		//jak przekazac tu obiekt samochod z konstruktora ???
		Samochod* n = new Samochod(;
		if (pHead == nullptr)
		{
			//nie wiem jak korzystać tu z konstruktora do tworzenia obiektu 
			cin >> pHead->podstawoweParametry.marka; 
			cin >> pHead->podstawoweParametry.model;
			//itd...
		}
		else
		{

		}

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

	bool usunSamochod(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 = this->last = nullptr;
		}

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

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

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

	//zlicza elementy
	int size()
	{
		int i = 0;
		Element* 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 };



	// teraz mam dodac do listy samochod

	// 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;
}

0

Co do hermetyzacji to zamiast zostawiać atrybuty (zmienne) pod klauzulą public: lepiej zrobić je prywatne, a publiczne stworzyć metody zwracające wartości tych atrybutów. Czyli zamiast:

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

zrób tak we wszystkich klasach. Wtedy dane będą hermetyczne.

class ParametrySamochodu
{
private:
    static int saldoSalonu;
    string marka, model;
    int cena, rokProdukcji, pojemnosc, przebieg, moc;
public:
    int pobierzSaldoSalonu();
    int pobierzCene();
    int pobierzRokProdukcji();
    int pobierzPojemnosc();
    int pobierzPrzebieg();
    int pobierzMoc();
    string pobierzMarke();
    string pobierzModel();
};

Chociaż w tym wypadku lepiej by było w ogóle zastosować strukturę.

0

Nie da rady dodawać tych danych w konstruktorze ?

0

Inicjalizację przeprowadzasz w konstruktorze, a metod publicznych używasz aby te dane pobrać/modyfikować. Chociaż ja w twoim przypadku zamiast klasy ParametrySamochodu raczej bym wykorzystał strukturę. Struktury to same dane, a klasy zawierają też metody. Wtedy nie trzeba by było pisać metod aby dane wyciągnąć.

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