Struktury

2017-01-17 12:50
Jacek Labudda
												

Czym są struktury?

Struktury pomagają w organizacji danych, poprzez przechowywanie pewnych, najczęściej powiązanych ze sobą zmiennych. Taką strukturą może być człowiek, ponieważ posiada pewne cechy, które łączą się w całość. Człowiek ma imię, nazwisko, wiek, wzrost, kolor oczu, itp...

Tworzenie struktury

Każdą strukturę poprzedza się słowem kluczowym struct, po czym należy nadać jej nazwę(typ). Nazwa struktury jest zarazem typem, ponieważ używając tej nazwy będziemy deklarować i definiować nowe obiekty struktury. Po nazwie struktury otwieramy nawiasy klamrowe i to w nich deklarujemy typy oraz nazwy zmiennych(pól), z których potem będziemy korzystać.
struct Czlowiek{ string imie, nazwisko, kolor_oczu; int wiek, wzrost; };
Powyżej została zadeklarowana struktura Czlowiek posiadająca 5 pól. Dane te możemy w odpowiedni sposób definiować. Aby to uczynić, należy stworzyć nowy obiekt struktury:
Czlowiek Antek;
Obiekt o nazwie Antek typu Człowiek. Do tak nowo utworzonego obiektu możemy przypisywać dane w różny sposób, np. tak:
Antek.imie = "Antek"; Antek.nazwisko = "Kowalski"; Antek.kolor_oczu = "niebieskie"; Antek.wiek = 19; Antek.wzrost = 185;
Do każdego elementu, który definiujemy, odnosimy się za pomocą znaku kropki. Można również przypisać dane z jednym poleceniu:
Antek = {"Antek", "Kowalski", "niebieskie", 19, 185};
Należy pamiętać, aby definiować pola w odpowiedniej kolejności, zależnej od tego w jakim miejscu zostały zadeklarowane. Wyświetlenie danych w obu przypadkach wygląda identycznie:
cout << Antek.imie << " " << Antek.nazwisko << " ma " << Antek.wiek << " lat, oczy " << Antek.kolor_oczu << " i " << Antek.wzrost << "cm wzrostu." << endl;
Wynik: Antek Kowalski ma 19 lat, oczy niebieskie i 185cm wzrostu. Kolejnym sposobem definiowania pól jest utworzenie konstruktora. Za pomocą konstruktora mamy możliwość szybkiego definiowania danych strukturalnych, podczas tworzenia nowego obiektu. Możemy również utworzyć destruktor, który w przeciwieństwie do konstruktora, jest wykonywany podczas niszczenia obiektu struktury. Oba te elementy muszą mieć taką samą nazwę jak nazwa struktury, z tym, że przed nazwą destruktora używamy znaku ~(tyldy). Nasza struktura z konstruktorem będzie wyglądała tak:
struct Czlowiek{ string imie, nazwisko, kolor_oczu; int wiek, wzrost; Czlowiek(string imie, string nazwisko, string kolor_oczu, int wiek, int wzrost){ //konstruktor this->imie = imie; this->nazwisko = nazwisko; this->kolor_oczu = kolor_oczu; this->wiek = wiek; this->wzrost = wzrost; } ~Czlowiek(){}; //dekstruktor };
Użyłem słowa kluczowego this ponieważ są dwie zmienne o takiej samej nazwie i kompilator by nie wiedział, do której konkretnie się odwołać. this informuje kompilator, że ta zmienna jest zmienną pochodzącą z tej klasy, a nie zmienną będącą argumentem konstruktora. Po stworzeniu takiej struktury dodajemy nowy obiekt. Słowo kluczowe new, tworzy nowy obiekt używając konstruktorów.
Czlowiek * Antek = new Czlowiek("Antek", "Kowalski", "niebieskie", 19, 185);
W tym przypadku utworzyliśmy wskaźnik do obiektu typu Czlowiek, zatem odnosić się do elementów będziemy za pomocą strzałki:
cout << Antek->imie << " " << Antek->nazwisko << " ma " << Antek->wiek << " lat, oczy " << Antek->kolor_oczu << " i " << Antek->wzrost << "cm wzrostu." << endl;
Usunięcie takiego obiektu wykonuje się za pomocą kolejnego słowa kluczowego delete.
delete Antek;
W tym momencie uruchamia się destruktor.

Metody

Funkcje w strukturze nazywamy metodą. Metoda ta może nam np. wyświetlić jakiś napis, korzystając z pól danej struktury:
void wypisz(){ cout << imie << " " << nazwisko << " ma " << wiek << " lat, oczy " << kolor_oczu << " i " << wzrost << " wzrostu." << endl; }

Modyfikator dostępu

W strukturach po raz pierwszy spotykamy się z modyfikatorami dostępu. Określają one dostęp do danych w strukturze, unii czy klasie. Są ogólnie 3 modyfikatory private(prywatny), public(publiczny) oraz protected(zabezpieczony). Ten ostatni jest stosowany w przypadku dziedziczenia klas(o tym w przyszłych lekcjach). Struktury używają public jako podstawowy dostęp, dzięki temu możemy korzystać z jej zmiennych oraz metod w każdej funkcji naszego programu. Istnieje możliwość zmiany modyfikatora dostępu na prywatny, przez co dane strukturalne będą dostępne tylko w obrębie danej struktury.
struct Samochod{ private: //prywatne dane string marka, model; public: //dane publiczne void nadaj(string marka, string model){ //modyfikowanie danych prywatnych this->marka = marka; this->model = model; } void wypisz(){ //wypisanie danych prywatnych cout << marka << " " << model << endl; } };

Reasumując

Lekcja nie może się obejść bez przykładu, który zobrazowałby nam wszystko jako jedną całość:
#include <iostream> using namespace std; struct Czlowiek{ //struktura //pola struktury string imie, nazwisko, kolor_oczu; int wiek, wzrost; void wypisz(){ //metoda cout << imie << " " << nazwisko << " ma " << wiek << " lat, oczy " << kolor_oczu << " i " << wzrost << " wzrostu." << endl; } Czlowiek(string imie, string nazwisko, string kolor_oczu, int wiek, int wzrost){ //konstruktor this->imie = imie; this->nazwisko = nazwisko; this->kolor_oczu = kolor_oczu; this->wiek = wiek; this->wzrost = wzrost; } ~Czlowiek(){ //destruktor }; }; int main(){ Czlowiek * Antek = new Czlowiek("Antek", "Kowalski", "niebieskie", 19, 185); //nowy obiekt zostal utworzony Antek->wypisz(); //dane zostaly wypisane delete Antek; //pamiec zostala zwolniona return 0; }
Wynik: Antek Kowalski ma 19 lat, oczy niebieskie i 185 wzrostu. Takie struktury można wykorzystać np. przy tworzeniu bazy danych graczy. Ilość obiektów jakie możemy stworzyć jest ograniczona do ilości pamięci zainstalowanej w komputerze. Należy pamiętać, że każda struktura używa pewną ilość pamięci zależną od ilości i od typów pól w niej zadeklarowanych.

Użytkownicy
Logowanie:
Zaloguj
Polub nas na facebooku
Wyszukiwanie na stronie