Dynamiczna tablica obiektów w klasie

0

Witam,
piszę program na zaliczenie semestru i trafiłem na problem. W jaki sposób w klasie umieścić dynamiczną tablicę z obiektami innej klasy? Konkretniej chodzi o to, że mam klasę Mieszkaniec (z polami Imie, Nazwisko i Wiek oraz metodami pozwalającymi wyświetlić i zmienić każde z pól) i klasę Mieszkanie (z polem Powierzchnia). Chciałbym aby po stworzeniu obiektu Mieszkanko tablica była pusta, a potem za pomocą metod możliwe było dodawania nowych obiektów z klasy Mieszkaniec.

Do tej pory napisałem coś takiego:

class Mieszkanie
{
	float Powierzchnia;
	unsigned int MaxIloscMieszkancow;
	Mieszkaniec *Mieszkancy;

public:

	Mieszkanie(const float powierzchnia)
	{
		if(powierzchnia >= 10) { Powierzchnia = powierzchnia; }
		MaxIloscMieszkancow = (int)(Powierzchnia/2);
		Mieszkancy = new Mieszkaniec[MaxIloscMieszkancow];
	}
}

oraz

class Mieszkaniec
{
	char Imie[15];
	char Nazwisko[15];
	float Wiek;

public:

	Mieszkaniec()
	{
		strcpy_s(Imie, 0);
		strcpy_s(Nazwisko, 0);
		Wiek = 0;
	}

	Mieszkaniec(const char *imie, const char *nazwisko, const float wiek, const unsigned int zadowolenie, const unsigned int uciazliwosc)
	{
		strcpy_s(Imie, imie);
		strcpy_s(Nazwisko, nazwisko);
		
		if(wiek >= 0) { Wiek = wiek; }
	}
	//METODY WYŚWIETLAJĄCE I PRZYPISUJĄCE WARTOŚCI DO Imie, Nazwisko i Wiek

}

Niestety ten kod nie działa, a przynajmniej ja nie umiem go w odpowiedni sposób wywołać z funkcji main tak żeby zadziałał.

Jak powinienem przerobić te klasy aby działały w opisany przeze mnie sposób? Poza tym jak je potem wywoływać z maina?

Z góry dziękuję za wszelką pomoc :)

0

Dziękuję za odpowiedź. Póki co nie bardzo to rozumiem ale postaram się jakoś to przeanalizować.

1

Potraktuj to jako rozszerzalna tablice. Nie sa Ci potrzebne szczegoly dotyczace zachowania tego kontenera, zeby z niego korzystac.
Dajmy na to chcesz zamodelowac studenta. Student ma tam jakies pola imie, nazwisko etc. + liste ocen.

class student
{
public:
	// konstruktory, itp.
	
	void dodajOcene(int oc)
	{
		oceny.push_back(oc);
	}
	
private:
	string imie;
	string nazwisko;
	vector<int> oceny;
};

i to cala filozofia zwiazana z tym pojemnikiem.

0

Dziękuję, to jest na pewno o wiele łatwiejsze w zrozumieniu. Wydaje mi się, że już wszystko działa poprawnie :)

edit.

Jednak przedwcześnie ogłosiłem sukces. Pierwszy element dodawany jest poprawnie, a przy kolejnych wyrzucany jest błąd.

Kod:

void DodajMieszkanca(const char *imie, const char *nazwisko, const float wiek)
{
	Mieszkancy.push_back(Mieszkaniec(imie, nazwisko, wiek));
}

Błąd:
199388205751534c0d7a6ae.png

edit 2.

Już wszystko w porządku, przeoczyłem jeden znak :)

0

Mam jeszcze jedno pytanie odnośnie klasy vector.

W moim projekcie mam taką klasę:

class Budynek
{
	unsigned int IloscPieter;
	unsigned int IloscMieszkanNaPietrze;
	
	vector<Mieszkanie> Mieszkanie_;

public:

	Budynek(const unsigned int iloscpieter, const unsigned int iloscmieszkannapietrze, const float powierzchnia)
	{
		if(iloscpieter >= 1) { IloscPieter = iloscpieter; }
		else { IloscPieter = 1; }
		if(iloscmieszkannapietrze >= 1) { IloscMieszkanNaPietrze = iloscmieszkannapietrze; }
		else { IloscMieszkanNaPietrze = 1; }

		for(unsigned int i = 0; i <= (IloscMieszkanNaPietrze * IloscPieter); ++i)
		{
			Mieszkanie_.push_back(Mieszkanie(powierzchnia));
		}
	}
};

Czy jest jakaś możliwość aby z funkcji main mieć dostęp do metod klasy Mieszkanie? Wiem, że mogę stworzyć w klasie Budynek nowe metody przekazujące albo pobierające dane od metod klasy Mieszkanie, ale takie rozwiązanie wygeneruje mi dodatkowe kilkaset linijek kodu.

0

W klasie Budynek dodałem:

vector<Mieszkanie> Zwroc()
{
	return Mieszkanie_;
}

a potem w funkcji main korzystam z:

Budynek blok(10, 5, 120);
	blok.Zwroc()[1].DodajMieszkanca("Jan", "Kowalski", 32, 100, 2);
	blok.Zwroc()[1].WyswietlMieszkancow();

Teoretycznie kompilator nie wyrzuca żadnych błędów ale funkcje nie działają tak jak powinny. Nie działają wcale...

DodajMieszkanca i WyswietlMieszkancow to metody klasy Mieszkanie.

0

n0name_l, jesteś wielki :)

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