|
Tematem tej lekcji będzie stworzenie przykładowej klasy w C++.Klasa ta będzie nazywać się Pudełko zapałek i będzie przeznaczona do czynności jakie można wykonać z pudełkiem zapałek. Co to jest klasa w C++? Klasa w C++ jest nowym typem danych, nierozerwalnie wiąże się z wszelkimi językami programowania zorientowanymi obiektowo.Każdy obiekt należy do jakiejś klasy.Z punktu widzenia typu danych klasę stanowią dane oraz funkcje - metody, które operują na tych danych.Dostęp do danych oraz funkcji składowych klasy może odbywać się z dowolnego miejsca programu (public), lub też tylko wewnątrz klasy (private lub protected).Więcej o klasach przeczytacie w tym serwisie - polecam dobry artykuł Tasmmana (link). Co można zrobić z pudełkiem zapałek? Pudełko zapałek jest genialne w swojej prostocie.Służy do jasno określonego celu i zawiera zapałki w ilości 0 lub większej.Aby wyjąć zapałkę z pudełka należy je wpierw otworzyć.W pudełku może być minimum 0 zapałek, a maksimum 49 (tak założyłem). Dla niecierpliwych Tak będzie wyglądał program, który będziemy pisać w tej lekcji.Pobrać go można tu. 
Jak widzimy, program posiada następujące funkcje: - otwarcie pudełka
- zamknięcie pudełka
- wyjęcie 1 zapałki
- włożenie 1 zapałki
- sprawdzenie ile zapałek jest w pudełku
- sprawdzenie czy pudełko jest zamknięte
Programujemy! Najpierw zaczniemy od stworzenia definicji klasy pudelko_zapalek.Definicję tę możemy umieścić w pliku cpp lub nagłówkowym h. class pudelko_zapalek
{
public:
int ile_zapalek;
void dodaj(ile);
void wyjmij(ile);
void otworz();
void zamknij();
bool czy_otwarte();
pudelko_zapalek() {
ile_zapalek=5;
otwarte=false;
}
~pudelko_zapalek() {
Beep(1000,100);
}
private:
int ile;
bool otwarte;
};W sekcji z dostępem publicznym znajduje się zmienna ile_zapalek określająca, ile aktualnie zapałek znajduje się w pudełku.Zmienna ta jest wykorzystana w konstruktorze klasy do ustalenia początkowej ilości zapałek w pudełku (5).Metoda czy_otwarte zwraca tak lub nie (bool).W tej klasie dopisany jest destruktor, jednak w tej prostej klasie jest tylko pokazowo.Co robi można się przekonać zamykając program lub usuwając obiekt klasy pudelko_zapalek. Funkcja czy_otwarte Oto kod funkcji sprawdzającej, czy pudełko zapałek jest otwarte. bool pudelko_zapalek::czy_otwarte() { if(otwarte) return true; else return false; } Jeśli zerkniemy wyżej do definicji klasy, zmienna otwarte jest dostępna wyłącznie wewnątrz klasy i oznacza stan otwarcia pudełka zapałek.Jest tak dlatego, żeby nie można było bezpośrednio ustawić stanu zamknięcia pudełka, a jedynie przez funkcję składową klasy. Funkcja otworz_pudelko i zamknij_pudelko Otwieramy pudełko następującym kodem: void pudelko_zapalek::otworz() { otwarte = true; } a zamykamy takim kodem: void pudelko_zapalek::zamknij() { otwarte = false; } Funkcja dodaj - dodajemy zapałki do pudełka void pudelko_zapalek::dodaj(int ile) { if(otwarte) { ile_zapalek+=ile; if(ile_zapalek>=49) ile_zapalek=49; } else { ShowMessage("Musisz najpierw otworzyc pudelko"); } } W kodzie tym sprawdzamy najpierw, czy pudełko jest otwarte.Jeśli nie jest, wyświetlany jest odpowiedni komunikat.Jeśli natomiast pudełko jest otwarte, przystępujemy do czynności.Sprawdzamy, czy w pudełku nie jest 49 lub więcej zapałek.Jeśli tak, nie zmieniamy zawartości pudełka.Jeśli w pudełku zapałek jest jeszcze wolne miejsce, zapełniamy je zapałkami.
Funkcja wyjmij - wyjmujemy zapałki z pudełka void pudelko_zapalek::wyjmij(int ile) { if(otwarte) { ile_zapalek-=ile; if(ile_zapalek<=0) ile_zapalek=0; } else { ShowMessage("Musisz najpierw otworzyc pudelko"); } } Sprawdzamy wpierw, czy pudełko zapałek jest otwarte.Jeśli jest, przystępujemy do wyjmowania zapałek.Wyjmujemy zapałki z pudełka ale maksymalnie do momentu, aż ich ilość będzie wynosić 0 (warunek brzegowy).Jeśli pudełko jest zamknięte, musimy je najpierw sami otworzyć. Mamy już zdefiniowaną naszą klasę oraz wszystkie metody wchodzące w skład tej klasy.Teraz pora na stworzenie deklaracji tej klasy, która będzie typu naszej klasy.Piszemy więc w programie deklarację klasy (o zasięgu globalnym): pudelko_zapalek pudelko; Jest to typ zadeklarowany statycznie.W tym momencie mamy już utworzony obiekt klasy pudelko_zapalek o nazwie pudelko.Analogicznie do tego jak deklarujemy inne zmienne, np. int a ;Na formę (C++ Builder -> New Application) kładziemy odpowiednie komponenty, widoczne na obrazku powyżej. Pod przyciskiem z etykietą dodaj wklejamy kod: void __fastcall TForm1::Button1Click(TObject *Sender) { pudelko.dodaj(1); } Pod przyciskiem z etykietą wyjmij umieszczamy następujący kod: void __fastcall TForm1::Button2Click(TObject *Sender) { pudelko.wyjmij(1); } Jeśli chcielibyśmy wyjąć lub dodać z pudełka zapałek ilość zapałek różną od 1, wystarczy zmienić argument funkcji dodaj lub wyjmij. Przycisk z etykietą ile_zapalek sprawdza nam, ile zapałek jest w pudełku oraz czy pudełko jest otwarte czy zamknięte. void __fastcall TForm1::Button3Click(TObject *Sender) { Label1->Caption = pudelko.ile_zapalek; bool z = pudelko.czy_otwarte(); if(z) Label2->Caption = "otwarte"; else Label2->Caption = "zamkniete"; } Przycisk z etykietą Otwórz pudełko otwiera pudełko zapałek (jednocześnie sam się dekatywuje). void __fastcall TForm1::Button4Click(TObject *Sender) { pudelko.otworz(); Button4->Enabled = false; Button5->Enabled = true; } Jest to przycisk bistabilny w połączeniu z przyciskiem Zamknij pudełko.Przycisk Zamknij pudełko wykonuje następujący kod: void __fastcall TForm1::Button5Click(TObject *Sender) { pudelko.zamknij(); Button4->Enabled = true; Button5->Enabled = false; } Więcej W powyższym programie zadeklarowaliśmy statycznie zmienną typu naszej klasy, nie musząc się martwić o zwolnienie jej zasobów.Równie dobrze można utworzyć wskaźnik i przypisać zmienną pudelko_zapalek.Jaka jest różnica? W zmiennej wskaźnikowej dostęp do danych i metod odbywa się przez wskaźnik (->), a w zmiennej statycznej przez referencję (.). 

To wszystko! Cały program.Jak widać nic trudnego.Zapraszam do komentowania.
|