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

Rozbudowa programu za pomocą agregacji

VPS Starter Arubacloud
0 głosów
143 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez Hyack Nowicjusz (200 p.)

Uszanowanko!

 

Mam do dodania kilka punktów na jutrzejszy code review z wykładowcą, a mianowicie:

Rozwinąć projekt pod kątem :

1. użycia agregacji

2. zagniedżania klas (tylko w polu prywatnym)

3. użycia mechanizmu przyjaźni

4. użycia konstruktorów ( kopiującego, delegującego, domyślnego) i destruktorów

5. specyfikatora deklaracji auto

 

..., z czego zrobiłem agregację, a zagnieżdżanie klasy średnio mi działa.


O to kod:

Main.cpp

#include "pojazdy.h"
#include <iostream>

using namespace std;

int main()
{
// AGREGACJA
class Adresy
{
	public:
		string ulica, miasto, woj;
		Adresy(string ulica, string miasto, string woj)
		{
			this->ulica = ulica;
			this->miasto = miasto;
			this->woj = woj;
		}
};


class Pracownik
{
	private:
		Adresy* adresy;
	public:
		int id;
		string nazwisko;
		Pracownik(int id, string nazwisko, Adresy* adresy)
		{
			this->id = id;
			this->nazwisko = nazwisko;
			this->adresy = adresy;
		}
		void display()
		{
			cout << endl;
			cout << "ID: " << id << " || " << "Nazwisko: " << nazwisko << " || " << "Ulica: " << adresy->ulica << " || " << "Miasto: " << adresy->miasto << " || " << "Woj: " << adresy->woj << endl;
		}
};
//AGREGACJA

	Pojazdy** poj;
	Pojazdy*** p_poj = &poj;


	int size{ 0 }, index{ 0 };
	Pojazdy::Petla(poj, size);

	Pojazdy::print(poj, size);
	//Pojazdy::print(p_poj, size);

	Pojazdy::wyrejestruj(poj, size, 0);
	Pojazdy::print(poj, size);
	Pojazdy::wyrejestruj(poj, size);
	
	//zmienne agregacji 
	Adresy a1 = Adresy("Kwiatkowskiego", "Szczecin", "Zachodniopomorskie");
	Pracownik p1 = Pracownik(101, "Kowalski", &a1);
	p1.display();  //pokazanie dzialania agregacji

	Pojazdy::Spec s1;
	cout << "Wynik: " << s1.p_spec << endl;

	return 0;
}

 

Pojazdy.h

#ifndef pojazdy_h
#define pojazdy_h

#include <iostream>
#include <cstdlib>
#include "klienci.h"

using namespace std;

class Pojazdy
{
// ZAGNIEŻDŻANIE KLAS W POLU PRYWATNYM
private:
	class Spec
	{

	public:
		string typ;
		string model;
		int moc;
		int pojemnosc;
		int przyspieszenie;
		int zuzycie_p;

		void p_spec(string typ, string model, int moc, int pojemnosc, int przyspieszenie, int zuzycie_p)
		{
			cout << "Podaj specyfikacje pojazdu:" << endl;
			cin >> typ >> model >> moc >> pojemnosc >> przyspieszenie >> zuzycie_p;
			cout << "Podano specyfikacje pojazdu!" << endl;
		}
	};


public:


	string typ;
	string marka;
	string model;
	string z_dod;
	int ilosc;
	int cena;


	Pojazdy();
	~Pojazdy();

	Pojazdy(const string& Typ, const string& Marka, const string& Model, int Cena);

	//static void dodaj();
	static void d_pojazd(Pojazdy**& pojazdy, int& size, const string& Typ, const string& Marka, const string& Model, int Cena);
	static void wyrejestruj(Pojazdy**& pojazdy, int& size);
	static void wyrejestruj(Pojazdy**& pojazdy, int& size, int index);
	static void print(Pojazdy** pojazdy, int size);
	static void print(Pojazdy*** pojazdy, int size);
	static void Petla(Pojazdy**& p, int& size);

	//void wyswietl();
	int get_ilosc() { return ilosc; }
	string get_typ() { return typ; }
	string get_marka() { return marka; }
	string get_model() { return model; }
	int get_cena() { return cena; }
	void set_ilosc(int x);
};

#endif

Pojazdy.cpp (tu wszystko gra i hula, wrzucam tylko do wglądu)

#include "pojazdy.h"

#include <iostream>

using namespace std;

void Pojazdy::set_ilosc(int x) { ilosc = x; }

Pojazdy::Pojazdy() {

}
Pojazdy::~Pojazdy() {

}

Pojazdy::Pojazdy(const string& Typ, const string& Marka, const string& Model, int Cena) :  typ(Typ), marka(Marka),model(Model), cena(Cena)
{
}


void Pojazdy::Petla(Pojazdy**& p, int& size) {
	char z_dod;// = 'N';
	do {
		string typ, marka, model;
		int cena;
		cout << "DODAWANIE POJAZDU..." << endl;
		cout << "Podaj typ pojazdu:";
		cin >> typ;

		cout << "Podaj marke pojazdu: ";
		cin >> marka;

		cout << "Podaj model pojazdu: ";
		cin >> model;

		cout << "Dodaj cene pojazdu: ";
		cin >> cena;

		Pojazdy::d_pojazd(p, size, typ,marka,model,cena); //odpowiada za dodawnie
		cout << "Czy chcesz zakonczyc dodawanie? Jesli tak, wcisnij Y/N: ";
		cin >> z_dod;

	} while (z_dod == 'N' || z_dod == 'n');//while (p[size]->z_dod == "N" ||p[size]->z_dod == "n");
}

void Pojazdy::print(Pojazdy** pojazdy, int size) {
	std::cout << "====================================" << std::endl;
	for (int i{ 0 }; i < size; i++)
		std::cout << "Typ: " << pojazdy[i]->get_typ() << " Marka: " << pojazdy[i]->get_marka() << " Model: " << pojazdy[i]->get_model() << " Cena: " << pojazdy[i]->get_cena() << std::endl;
}

void Pojazdy::print(Pojazdy*** pojazdy, int size) {
	std::cout << "====================================" << std::endl;
	for (int i{ 0 }; i < size; i++)
		for(int j{0};j <4;j++)
		std::cout << "Typ: " << pojazdy[i][j]->get_typ() << " Marka: " << pojazdy[i][j]->get_marka() << " Model: " << pojazdy[i][j]->get_model() << " Cena: " << pojazdy[i][j]->get_cena() << std::endl;
}	

void Pojazdy::wyrejestruj(Pojazdy**& pojazdy, int& size) {
	for (size_t i{ 0 }; i < size; i++)
		delete pojazdy[i];
	delete[] pojazdy;
	size = 0;
	pojazdy = NULL;
}

void Pojazdy::wyrejestruj(Pojazdy**& pojazdy, int& size, int index) {
	if (index < size) {
		Pojazdy** temp = new Pojazdy * [size - 1];
		short int j{ -1 };
		for (size_t i{ 0 }; i < size; i++) {
			if (i != index) {
				j++;
				temp[j] = pojazdy[i];
			}
		}
		delete[] pojazdy;
		--size;
		pojazdy = temp;
	}
	else
		std::cout << "Pamiec zwolniona!" << std::endl;
}

void Pojazdy::d_pojazd(Pojazdy**& pojazdy, int& size, const string& Typ, const string& Marka, const string& Model, int Cena) {
	Pojazdy** temp = new Pojazdy * [size + 1];
	if (size == 0)
		temp[size] = new Pojazdy(Typ, Marka, Model, Cena);
	else {
		for (int i{ 0 }; i < size; i++)
			temp[i] = pojazdy[i];
		delete[] pojazdy;

		temp[size] = new Pojazdy(Typ,Marka,Model,Cena);
	}
	++size;
	pojazdy = temp;
}

 

Gdy w mainie próbuję wywołać Pojazdy::Spec s1 to niestety wywala mi błąd mówiący o tym, że jest w polu prywatnym i niestety nie da się z tym nic zrobić.

 

Co do reszty podpunktów, nie mam pomysłu, więc byłbym wdzięczny za jakąkolwiek pomoc - nie muszą być to wyszukane metody, a najprostsze wykorzystanie reszty podpunktów od 3-5.

 

Dzięki!

komentarz 21 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)
1. Od kiedy definujesz klasy w funkacj? Wywal je przed maina.

2. Ma to byc slaba czy mocna agregacja, czyli agegacja czy kompozycja?
komentarz 21 kwietnia 2020 przez Hyack Nowicjusz (200 p.)
Słaba agregacja, ważne by wpasowała się w kontekst całego programu.
komentarz 21 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)

Problemem jest to, ze probujesz sie dostac do pola prywatnego klasy. Dodaj sobie funkcj, ktora stworzy nowy obiekt klasy Spec. Zeby dostac sie do prywatnych pol jakies klasy musisz zrobic to przez funkcje, poniewaz tylko funkcje wenatrz klasy maja prawo dotknac tych danych. To jest koncepcja oop lub encapsulation

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 449 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
+1 głos
2 odpowiedzi 458 wizyt
pytanie zadane 7 czerwca 2017 w C i C++ przez mel0n Początkujący (400 p.)
0 głosów
2 odpowiedzi 855 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez minemoney Nowicjusz (240 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...