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

C++ struktura zawierająca tablicę

Cloud VPS
0 głosów
1,258 wizyt
pytanie zadane 25 października 2020 w C i C++ przez hicodyn Początkujący (420 p.)

Muszę stworzyć strukturę zawierającą tablicę osób ( z wcześniej stworzonej struktury Osoby zawierającej string imie i int wiek). Oprócz tablicy w strukturze ma się znaleźć jeszcze rozmiar tej tablicy i ilość zajętych miejsc. Nie wiem jak mam utworzyć tę strukturę, ponieważ tablica powinna mieć od razu zadeklarowany rozmiar. Do tego skąd mam wiedzieć ile miejsc jest już zajętych?

#pragma once

struct Osoba
{
	std::string imie;
	int wiek;
};

struct Osoby
{
	Osoba tab[];
	int rozmiar;
	int zajete_miejsca;
};

 

1 odpowiedź

+1 głos
odpowiedź 25 października 2020 przez tangarr Mędrzec (155,180 p.)

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)

Podobne pytania

0 głosów
2 odpowiedzi 703 wizyt
pytanie zadane 11 września 2020 w C i C++ przez Kytrap Początkujący (390 p.)
0 głosów
1 odpowiedź 2,776 wizyt
pytanie zadane 3 października 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 504 wizyt

93,488 zapytań

142,422 odpowiedzi

322,772 komentarzy

62,906 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

Kursy INF.02 i INF.03
...