Do wyboru masz kilka opcji. Jedną z najprostszych będzie użycie tablicy dynamicznej.
struct Osoby
{
Osoba *tab;
int rozmiar;
int zajete_miejsca;
};
W tej sytuacji musisz ręcznie pilnować poprawności pól oraz ręcznie zarządzać pamięcią.
// Tworzenie obiektów i przydzielanie pamięci
Osoby osoby1{ new Osoby[10], 10, 0 };
Osoby osoby2;
osoby2.tab = new Osoby[5];
osoby2.rozmiar = 5;
osoby2.zajete_miejsce = 0;
// Zwalnianie pamięci
delete [] osoby1.tab;
delete [] osoby2.tab;
Jak widzisz, przy takiej strukturze łatwo się pomylić i doprowadzić do błędów pamięci.
Sytuację można poprawić poprzez dodanie konstruktora i destruktora.
struct Osoby
{
Osoba *tab;
int rozmiar;
int zajete_miejsca;
Osoby(int rozmiar) {
cout << "Konstruktor struktury" << endl;
tab = new Osoba[rozmiar];
this->rozmiar = rozmiar;
zajete_miejsca = 0;
}
~Osoby() {
cout << "Destruktor struktury" << endl;
delete [] tab;
}
};
Przykład użycia
int main() {
int rozmiar;
cin >> rozimar;
Osoby osoby(rozmiar);
// operacja na danych
}
// przy wyjściu z zakresu nastąpi wywołanie destruktora i zwolnienie pamięci
W tej sytuacji nie trzeba już ręcznie zarządzać pamięcią ale cały czas można coś przez nieuwagę popsuć (ponieważ pola struktury są dostępne z zewnątrz)