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

C++ struktura zawierająca tablicę

Object Storage Arubacloud
0 głosów
1,034 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 (154,860 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 426 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,453 wizyt
pytanie zadane 3 października 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 385 wizyt

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...