klasy, Programowanie, C++


Na język C++ składa się wiele drobnych rozszerzeń klasycznego C oraz jeden ważny dodatek: klasy. W tym, ostatnim już, odcinku podstaw C++ zajmiemy się podstawami programowania obiektowego.

Najprostsze wyjaśnienie (nie oddające głębi problemu), czym są klasy, brzmi mniej więcej tak: klasa to struktura uzupełniona o funkcje (nazywane funkcjami składowymi albo - z angielskiego - metodami klasy). Posłużymy tu się prostym przykładem: sięgniemy do wiedzy wyniesionej ze szkoły i utworzymy klasę o nazwie "wektor". Do jednoznacznego opisania wektora w układzie współrzędnych potrzebujemy czterech liczb (rzeczywistych): współrzędne x i y początku oraz końca wektora. Odpowiednia struktura danych mogłaby wyglądać tak:

struct wektor {

double xp, yp;

double xk, yk;

};

Pamiętamy, że odwołanie do wnętrza struktury odbywa się przy użyciu ".". Chcielibyśmy też wykonywać na strukturze jakieś sensowne działanie, np. dodawanie wektorów. I tu zaczynamy myśleć o wektorze jako obiekcie, który "modelujemy" w języku C++ - zawieramy w modelu (czyli klasie) pewne dane, którymi w określony sposób manipulujemy. A oto prosta definicja klasy "wektor":

class wektor {

private:

double xp, yp;

double xk, yk;

public:

void Dodaj(wektor w1, wektor w2);

void Wypisz(void);

};

Widzimy, że klasa została podzielona na część prywatną (zaczynającą się słówkiem "private:") i publicznie dostępną ("public:"). Otóż część prywatna (w której mogą znajdować się zarówno zmienne, jak i funkcje składowe; w naszym przykładzie są tam tylko zmienne) jest dostępna tylko i wyłącznie z wewnątrz klasy i można z nich korzystać, np. w funkcjach składowych należących do tej samej klasy. Część publiczna nie ma już takich ograniczeń i można z niej korzystać do woli. To trochę niejasne wytłumaczenie najlepiej obrazuje dalsza część przykładu:

class wektor {

... // jak wyżej

};

void wektor::Wypisz(void)

{

// w tym miejscu wolno

// nam korzystać z danych

//z części "private:"

cout << "xp = " >> xp

<< endl

<< "yp = " << yp << endl

<< "xk = " << xk << endl

<< "yk = " << yk << endl;

}

void main(void)

{

wektor wekt1;

wekt1.Wypisz();

//Wypisz() jest w części

//"public:", więc można używać

wekt1.xp = 3.55;

//Błąd! "xp" jest składnikiem

//prywatnym!

}

Ale, ale... Jak dotąd możemy wypisać na ekranie współrzędne wektora, lecz w żaden sposób nie mamy wpływu na to, jakie wartości mają te współrzędne. Musimy wstawić do klasy (oczywiście po słówku "public:") jeszcze jedną funkcję:

void Ustaw(double _xp, double _yp, double _xk, double _yk)

{

xp = _xp; yp = _yp;

xk = _xk; yk = _yk;

}

Teraz inicjalizację wektora robimy tak:

wektor wekt1;

wekt1.Ustaw(0, 1, 5.3, 8.1);

Oczywiście gdybyśmy nasze zmienne oznaczające współrzędne wektora umieścili w części publicznej klasy, wtedy nie zachodziłaby potrzeba pisania funkcji "Ustaw" - do współrzędnych moglibyśmy zaglądać bezpośrednio, pisząc w kodzie programu np. "cout << wekt1.xp;". Nasz prosty przykład obrazuje tzw. enkapsulację danych. Często tak bywa, że z klasy napisanej przez jednego programistę korzystają inni programiści na całym świecie. Tak było i w naszym przypadku, gdy zajmowaliśmy się operacjami dyskowymi w jednym z poprzednich odcinków - użyliśmy wtedy obiektów stworzonych z klas "ifstream", "ofstream" i "fstream". Podczas pisania programu widzieliśmy jedynie publiczną część tych klas, czyli np. funkcje "open", "close", "read" itp., natomiast wszystkie wewnętrzne szczegóły (jak bufory, konwersje danych) zostały przed nami ukryte.
Co jeszcze zyskujemy dzięki klasom? Pisząc funkcje składowe zastanawiamy się nad algorytmem rozwiązującym pewien problem tylko dla pojedynczego egzemplarza naszego obiektu. W dalszej części programu używamy tej funkcji składowej na dowolnym egzemplarzu obiektu i musi ona poprawnie zadziałać! W naszym przykładzie funkcja składowa "Dodaj" klasy wektor wygląda tak:

void wektor::Dodaj(wektor w1, wektor w2)

{

xp = w1.xp; yp = w1.yp;

xk = w1.xk + w2.xk - w2.xp; yk = w1.yk + w2.yk - w2.yp;

}

Jak widzimy, napisaliśmy jedynie kod dodający wektory w1 i w2. Teraz w głównym programie możemy utworzyć dowolną liczbę obiektów typu "wektor" (np. dużą tablicę) i wykonywać na nich działania:

wektor v1, v2, v3;

v1.Ustaw(0, 1, 5.3, 8.1);

v2.Ustaw(3, -1.1, 3, -0.5);

//v3 = v1 + v2:

v3.Dodaj(v1, v2);

v3.Wypisz();

Niestety, w naszym krótkim wprowadzeniu do programowania obiektowego pominęliśmy wiele bardzo ważnych informacji, jak chociażby ta, czym są i do czego służą konstruktory i destruktory; czym jest przeładowanie operatorów itd. Tak się składa, że tematu klas i programowania obiektowego nie wyczerpują nawet 600-stronicowe książki, tym bardziej nie uda się to w czasopiśmie (chyba że w 100 odcinkach, na co sobie nie możemy pozwolić).
Jeszcze jedna rzecz będzie niezbędna do zrozumienia dalszej części artykułu. W powyższych przykładach odwoływaliśmy się do elementów składowych (zmiennych i funkcji) klasy w sposób bezpośredni, tzn. pisząc nazwę obiektu i po kropce nazwę funkcji, którą chcemy wywołać na rzecz tego obiektu. Istnieje jeszcze sposób pośredni, w którym używa się wskaźnika do obiektu. Wtedy nie wolno nam zastosować ".", tylko musimy użyć "-< " :

wektor wekt1;

wektor *wsk_wekt;

wsk_wekt = &wekt1;

wekt1.Wypisz(); //dobrze

wsk_wekt.Wypisz(); //źle!

wsk_wekt->Wypisz(); //dobrze

wekt1->Wypisz(); //źle!

Zastosowanie "." zamiast "-< " w przypadku pracy ze wskaźnikiem na obiekt, to jeden z najczęściej popełnianych błędów.

Otwórzcie okna
0x08 graphic
Jako, że nasz jubileuszowy konkurs programistyczny jest już rozwiązany, a nagrody, czyli 3 egzemplarze kompilatora Borland C++ Builder 5 Standard firmy Inprise wysłane pocztą, zachęcam wszystkich użytkowników, którzy zamierzają programować w C++ do wykorzystywania tego narzędzia. Aby otrzymany jako nagroda lub zakupiony pakiet nie kurzył się gdzieś na półce, pokażemy, jak stawiać pierwsze kroki w pisaniu aplikacji dla Windows. Po instalacji i uruchomieniu pakietu ujrzymy widok podobny do poniższego. W centralnej części znajdują się dwa okna, jedno z nich (o początkowym nagłówku "Form1") jest głównym oknem nowej aplikacji i na nim nanosimy żądane elementy (kontrolki) środowiska Windows: przyciski, pola edycyjne, rozwijane listy itp. Właściwości aktualnie zaznaczonej kontrolki wyświetlane są w oknie "Object Inspector", znajdującym się w lewej części ekranu. Tam możemy ustalać m.in. jej wygląd: rozmiar i rodzaj fontu, kolory tła i tekstu oraz wiele innych. W tym samym okienku zakładka "Events" (zdarzenia) odpowiada za reakcję danego elementu aplikacji na to, co się z nim dzieje.

0x08 graphic
I tak, jeśli do naszej aplikacji wstawiliśmy przycisk, to prawie na pewno musimy napisać kod obsługujący wciśnięcie myszką przycisku. Odpowiednie zdarzenie nosi nazwę "OnClick" - po prawej stronie nazwy zdarzenia wpisujemy nazwę funkcji obsługującą to zdarzenie. Po zaakceptowaniu nazwy zostaniemy przeniesieni do okna edycyjnego.
Każda z systemowych kontrolek wewnątrz programu istnieje jako obiekt. I tak, pierwszy wstawiony przycisk ma nazwę "Button1", drugi - "Button2". Każdy typ kontrolki ma swoją wiodącą nazwę, domyślnie zakończoną kolejnym numerem. Teraz, chcąc np. wyłączyć działanie przycisku, piszemy w programie:

Button1-<Enable = false;

Na podstawie powyższego zapisu od razu domyślamy się, że "Button1" jest wskaźnikiem do obiektu...
Każdy obiekt ma wiele funkcji składowych oraz właściwości, nawet krótkie ich wymienienie zajęłoby znaczną objętość naszego pisma - od tej pory musimy polegać na dokumentacji dołączonej do kompilatora. Co dalej? Najwyższy czas, aby pogłębić swoją wiedzę sięgając po literaturę. Gorąco polecam książkę pt.: "Symfonia C++" Jerzego Grębosza, o której nie mogę powiedzieć, że się z niej uczyłem C++. Ja się po prostu nauczyłem programować w C++ dzięki tej publikacji. Przyda się też jakiś podręcznik dla osób chcących pisać programy dla Windows - tu wskazanie konkretnego tytułu nie jest już takie proste. Oczywiście trzeba zaopatrzyć się w książkę opisującą posiadane przez nas środowisko - Borland C++ Builder lub Visual C++.

Nieco historii...

Dlaczego język C++ właśnie tak się nazywa? Otóż pod koniec lat 60. w laboratoriach firmy Bell Telephone powstał język programowania wysokiego poziomu (tzn. wyższego od asemblera) przeznaczony do usprawnienia tworzenia nowych programów dla opracowywanego również w tych samych laboratoriach systemu Unix. Kierujący projektem Ken Thompson opracował język nazwany przez niego po prostu B. Działał on na platformie sprzętowej PDP-7 (pamięć tego komputera to oszałamiające... 8192 słowa 18-bitowe). Niedługo póĽniej, po wprowadzeniu PDP-11 (24 kB) na scenę wkracza Dennis M. Ritchie (rok 1971), który wprowadza nieco zmian do języka B i nazywa go NB (New B - nowy B). 
W trakcie dalszej pracy nad językiem NB Ritchie decyduje się na powrót do "tradycji" jednoliterowych nazw - tak rodzi się C. Przez kolejne lata język C jest dalej rozwijany, wreszcie w 1983 roku rozpoczyna się proces jego standaryzacji, trwaj±cy aż do 1989 r. W tzw. międzyczasie, bo w 1986 r., powstaje jeden z proponowanych następców języka C (autorem jest Stroustrup). Można by się było spodziewać, że otrzyma on nazwę D. Tak się jednak nie stało: twórca C++ wykorzystał w nazwie znany nam z języka C (i istniejący również w B) operator inkrementacji o jeden. Tak naprawdę, C++ == D...

0x01 graphic

Copyright © 2000-2001 Bartosz 'SILV' Jaworski
All rights reserved



Wyszukiwarka

Podobne podstrony:
Klasy, Programowanie, wykłady C++
26.1 Klasy w C++, Programowanie, Klasa III
Obiekty i klasy(2), Programowanie
powtórzenie klasy, Programowanie, wykłady C++
Program nauczania klasy 4 6 SP (DKW 4014 59 99)
Program integracji dla klasy I C w Szkole Podstawowej nr 2 w Toruniu
PROGRAM Zajęc z muzyki dla klasy II, pliki zamawiane, edukacja
katecheza, szczegółowy program katechezy klasy 6, Szczeg˙˙owy program kat
PROGRAM ZAJĘĆ REEDUKACYJNYCH DLA UCZNIA KLASY PIERWSZEJ Z TRUDNOŚCIAMI W NAUCE
26.5 Klasy - dziedziczenie, Programowanie, Klasa III
PROGRAM ZAJĘC WYRÓWNAWCZYCH DLA KLASY IV, PROGRAM
PROGRAM ARTYSTYCZNY Z OKAZJI ŚWIĘTA NIEPODLEGŁOŚCI PRZYGOTOWANY PRZEZ UCZNIÓW KLASY I, scenariusze z
PLAN?UKACJI RELIGIJNEJ W ZAKRESIE I,II,III KLASY GIMNAZJUM plus podstawa programowa 2(1)x
2009 11 Klasy cech w programowaniu generycznym [Programowanie C C ]
Program wychowawczy klasy IIb
Program rewalidacji indywidualnej dla uczennicy klasy pierwszej gimnazjum, dla dzieci, rewalidacja i
po program nauczania strona tytułowa 1, PO, Program nauczania do klasy I edukacja
O Ś W I A D C Z E N I E podstawa programowa, PO, Program nauczania do klasy I edukacja
Podstawa Programowa- klasy 1-3, edukacja elementarna

więcej podobnych podstron