Programowanie obiektowe w języku C++

Podobne dokumenty
Wprowadzenie do programowanie obiektowego w języku C++

Metodyki programowania. Roman Simiński programowanie.siminskionline.pl. Wprowadzenie do podejścia zwinnego

Projektowanie obiektowe

Programowanie obiektowe - 1.

Podstawy Programowania Obiektowego

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Modelowanie i Programowanie Obiektowe

Wstęp do programowania obiektowego. Wykład 2

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

TEMAT : KLASY DZIEDZICZENIE

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Technologie i usługi internetowe cz. 2

Wykład 8: klasy cz. 4

Programowanie obiektowe

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 5: Klasy cz. 3

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Język programowania. Andrzej Bobyk

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

1 Podstawy c++ w pigułce.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podstawy Programowania 2

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

ZARZĄDZANIU. Wykład VI. dr Jan Kazimirski

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Laboratorium 1 - Programowanie proceduralne i obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Podstawy programowania w języku C++

10. Programowanie obiektowe w PHP5

Definiowanie własnych klas

Szablony funkcji i szablony klas

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Rozdział 4 KLASY, OBIEKTY, METODY

Technologie obiektowe

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Wykład 9: Polimorfizm i klasy wirtualne

Do czego służą klasy?

Deklaracja struktury w C++

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Każdy z nich posiada swoje parametry. W przypadku silnika może to być moc lub pojemność, w przypadku skrzyni biegów można mówić o skrzyni

Projektowanie obiektowe. Roman Simiński Polimorfizm

Materiały do zajęć VII

1 Podstawy c++ w pigułce.

Wprowadzenie do szablonów szablony funkcji

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Mechanizm dziedziczenia

Zmienne, stałe i operatory

Wprowadzenie do szablonów szablony funkcji

Język ludzki kod maszynowy

Programowanie obiektowe

Wykład :37 PP2_W9

Budowa i generowanie planszy

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Spis treści. 1 Java T M

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Programowanie Obiektowe i C++

Algorytm. a programowanie -

Podstawy Programowania Programowanie Obiektowe

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

KLASY cz.1. Dorota Pylak

Wprowadzenie do programowanie obiektowego w języku C++

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Wykład 4: Klasy i Metody

Do czego służą klasy?

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Zaawansowane programowanie w C++ (PCP)

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

ALGORYTMY I STRUKTURY DANYCH

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Programowanie obiektowe

Programowanie w języku Python. Grażyna Koba

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Programowanie obiektowe w języku C++

C++ Przeładowanie operatorów i wzorce w klasach

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Programowanie obiektowe

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Transkrypt:

Programowanie obiektowe w języku C++ Roman Simiński romansiminski@usedupl wwwsiminskionlinepl Koncepcja programowania obiektowego

Programowanie obiektowe trochę historii Programowanie obiektowe nie jest nowością ostatnich lat obiektowość w programowaniu pojawia się mniej lub bardziej jawnie od wielu lat Pierwszym znanym językiem wykorzystującym obiekty był język Simula67, opracowany w latach 60-tych w Norweskim Ośrodku Obliczeniowym w Oslo przez O-J Dahla, B Myhrhauga i K Nygaarda Termin object oriented programming pojawił się w latach 70-tych wraz z językiem Smalltalk, wywodzącym się z Xerox Palo Alto Research Center Język Smalltalk, inspirowany językiem Simula 67, posiada szereg eresujących właściwości Oprócz cech obiektowych posiada rozbudowane biblioteki, środowisko programistyczne, działa z wykorzystaniem maszyny wirtualnej Mimo swojego nowatorstwa jak i zaawansowania technologicznego Smalltalk nie zdobywa popularności, staje się jednak źródłem inspiracji dla wielu innych języków obiektowych Programowanie obiektowe w C++ 2

Programowanie obiektowe trochę historii, cd Koncepcja obiektowości w programowaniu znajduje wielu zwolenników Powstają obiektowe rozszerzenia istniejących języków programowania (np Object Pascal, C++, Objective-C) Powstają nowe języki, rdzennie posiadające wbudowane mechanizmy obiektowe Są to zarówno języki ortodoksyjnie obiektowe (np Oberon, Ruby), jak i języki wywodzące się z nurtu hybrydowego (np Java, JavaScript, C#, PHP) Obiektowość w programowaniu jest jednolita na poziomie koncepcji, jednak w zakresie rozwiązań szczegółowych i implementacyjnych występują różnice Popularne aktualnie języki programowania, takie jak Java, C#, PHP, JavaScript, ActionScript, wykorzystują (w różnym co prawda stopniu) koncepcję programowania obiektowego wywodzącą się z języka C++ Programowanie obiektowe w C++ 3

Programowanie obiektowe ogólna koncepcja Co to jest obiekt? Jak jest zbudowany? Jak działa? Koncepcja Koncepcja programowania programowania obiektowego obiektowego jest jest prosta prosta ii naturalna naturalna Aby Aby ją ją sugestywnie sugestywnie przedstawić, przedstawić, proponuję proponuję rozważenie rozważenie pewnego pewnego przykładu, przykładu, zrealizowanego zrealizowanego najpierw najpierw strukturalnie strukturalnie aa potem potem obiektowo obiektowo Programowanie obiektowe w C++ 4

Przykład Napisać program wyświetlający na pustym ekranie tekstowym zadany znak (np * ), pozwalający na przesuwanie tego znaku w górę, dół, lewo i prawo, przy użyciu klawiszy sterowania kursorem X 1 2 3 4 5 79 80 1 2 3 4 5 * Y 24 25 Programowanie obiektowe w C++ 5

Dekompozycja problemu z mniejszym być może łatwiej walczyć Rozwiązanie zadanego problemu w programowaniu polega na wykonaniu sekwencji pewnych czynności, zgodnie z algorytmem rozwiązania tego problemu Dekompozycyjna strategia rozwiązywania problemów polega na dzieleniu potencjalnie dużego i złożonego problemu na podproblemy tak długo, aż wyodrębnione podproblemy staną się proste do rozwiązania Podproblem 11 Podproblem 12 Podproblem 1? Problem? Podproblem 2 Programowanie obiektowe w C++ 6

Podejście proceduralne Proceduralne podejście do programowania zakłada, że złożone czynności niezbędne do rozwiązania problemu będą opisane procedurami (podprogramami), rozbijanymi na kolejne podprocedury tak długo, aż uzyskane zostaną czynności proste, łatwe do zaprogramowania Podprogram11 Podprogram12 Podprogram1 Program Podprogram2 Programowanie obiektowe w C++ 7

Podejście strukturalne Podejście strukturalne rozwija ideę programowania proceduralnego, zakładając tworzeniu programów w taki sposób, że blok główny programu stanowi szkielet, określający kolejność realizacji czynności, zapisanych w postaci odpowiednich procedur i/lub funkcji Podprogramy wykorzystują globalne i lokalne struktury danych Podprogram11 Dane Podprogram12 Podprogram1 Dane Dane Podprogram2 Program Dane Dane Programowanie obiektowe w C++ 8

Analiza dane i czynności związane z przesuwaniem punktu Pozycja przesuwanego znaku będzie opisana parą zmiennych x i y, kod tego znaku (wygląd) będzie opisany zmienną shape Przesuwanie znaku polega na wymazywaniu znaku na pozycji poprzedniej i ponownym wyświetlaniu na pozycji nowej, o ile jest ona prawidłowa X 1 2 3 4 5 1 2 3 4 5 Gdy klawisz UP: jeżeli y > 1 to y = y - 1 Gdy klawisz LEFT: jeżeli x > 1 to x = x - 1 * Y 24 25 79 80 Gdy klawisz RIGHT: jeżeli x < 80 to x = x + 1 Gdy klawisz DOWN: jeżeli y < 25 to y = y + 1 Programowanie obiektowe w C++ 9

Analiza wymagane funkcje obsługi konsoli Zakładamy, że mamy do dyspozycji funkcje obsługi ekranu konsoli: Funkcję clearscreen, czyszczącą ekran tekstowy Funkcję writecharxy, wyświetlającą na ekranie znak na określonej pozycji X 1 2 3 4 5 79 80 1 2 3 4 5 * Y writecharxy( writecharxy( 40, 40, 12, 12, '*' '*' 24 25 Standard Standard bibliotek bibliotek języka języka C/C++ C/C++ nie nie zawiera zawiera funkcji funkcji obsługi obsługi konsoli konsoli operacje operacje te te są są mocno mocno zależne zależne od od środowiska środowiska systemowego, systemowego, w w niektórych niektórych zresztą zresztą nie nie występują występują wcale wcale Operacje Operacje te te należy należy zaimplementować zaimplementować samemu samemu lub lub wykorzystać wykorzystać rozszerzenia rozszerzenia dodawane dodawane przez przez producentów producentów kompilatorów kompilatorów Przykładowe implementacje powyższych funkcji zawiera suplement umieszczony na końcu tego dokumentu Programowanie obiektowe w C++ 10

Analiza wymagane funkcje obsługi konsoli Zakładamy, że mamy do dyspozycji obsługę klawiatury konsoli: Funkcję getkey, której rezultatem jest kod klawisza, w tym tzw klawiszy sterujących kursorem (czytanie znaku bez echa na ekranie i bez "potwierdzania" Enterem) Stałe określające kody klawiszy, wtym klawiszy sterujących kursorem (dla funkcji getkey): KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_ESC key; key; key key == getkey( getkey( /* /* Czekaj Czekaj na na naci naciśśni nięęcie cie klawisza klawisza */ */ switch( switch( key key )) case :: /* case KEY_UP KEY_UP /* Obsługa Obsługa strzałki strzałki ww gor goręę */ */ break; break; case */ case KEY_DOWN KEY_DOWN :: /* /* Obsługa Obsługa strzałki strzałki ww dół dół */ break; break; case case KEY_LEFT KEY_LEFT :: /* /* Obsługa Obsługa strzałki strzałki ww lewo lewo */ */ break; break; case case KEY_RIGHT KEY_RIGHT :: /* /* Obsługa Obsługa strzałki strzałki ww prawo prawo */ */ break; break; Przykładową implementację funkcji getkey zawiera suplement umieszczony na końcu tego dokumentu Programowanie obiektowe w C++ 11

Realizacja strukturalna najprostsza wersja char char key, key, xx == 40, 40, yy == 12; 12; shape = '*'; shape = '*'; clearscreen( clearscreen( do do writecharxy( writecharxy( x, x, y, y, shape shape key key == getkey( getkey( writecharxy( writecharxy( x, x, y, y, '' '' switch( switch( key key )) case case KEY_UP KEY_UP case case case case case case :: if( if( yy >> break; break; KEY_DOWN KEY_DOWN :: if( if( yy << break; break; KEY_LEFT KEY_LEFT :: if( if( xx >> break; break; KEY_RIGHT KEY_RIGHT :: if( if( xx << break; break; /* /* /* /* /* /* Wy Wyśświetl wietl znak znak na na zadanej zadanej pozycji pozycji Czekaj Czekaj na na naci naciśśni nięęcie cie klawisza klawisza Wyma Wymażż znak, znak, potencjalny potencjalny ruch ruch 11 )) --y; --y; /* /* Przeskocz Przeskocz wy wyżżej ej */ */ 24 24 )) ++y; ++y; /* /* Przeskocz Przeskocz ni niżżej ej */ */ 11 )) --x; --x; /* /* Przeskocz Przeskocz ww lewo lewo */ */ 80 80 )) ++x; ++x; /* /* Przeskocz Przeskocz ww prawo prawo */ */ */ */ */ */ */ */ while( while( key key!=!= KEY_ESC KEY_ESC Programowanie obiektowe w C++ 12

Realizacja strukturalna wady Wady techniczne Brak jawnego powiązania pomiędzy zmiennymi x, y i shape A przecież te zmienne opisują jeden obiekt! Brak jawnego powiązania pomiędzy fragmentem wyświetlającym (ukrywającym) punkt oraz zmiennymi go opisującymi Siermiężne testowanie poprawności współrzędnych Wady metodyczne Z kodu programu nie wynika bezpośrednio, jakie jest jego przeznaczenie, brak powiązań pomiędzy wykonywanymi akcjami a danymi Sam algorytm jest prosty, lecz jego zapis nie wspomaga zrozumienia jaka jest istota rozwiązywanego problemu Programowanie obiektowe w C++ 13

Od programowanie proceduralnego do obiektowego Podejdźmy do problemu inaczej spróbujmy zrozumieć jego istotę Zapraszamy na: Krótki wywiad z głównym bohaterem programu! Programowanie obiektowe w C++ 14

Czwartek 24 maja 2011 Redaktor Prowadzący Roman Simiński Fakty IT gazeta codzienna Niecodzienny dodatek Gazety Codziennej Tylko u nas, ekskluzywny wywiad z głównym bohaterem Programu Jak się nazywasz? No, wiesz, na imię mam nieciekawie jestem R, po prostu R Kim jesteś? Jestem ruchomym punktem ekranowym Ponieważ zasuwam po całym ekranie, można o mnie powiedzieć z angielska, że jestem jednym z Runner ów Czyli może Was być więcej? wywiadu jest ruchomy punkt Takich jak ja może być więcej W tym programie potrzeba tylko jednego Runner'a, więc oto jestem ekranowy Dzięki temu Powiedz nam coś o sobie wyjątkowemu wywiadowi Co tu dużo gadać Jak trzeba to mnie widać, jak nie trzeba to znikam Potrafię się przesunąć o jedno pole w górę, w dół, w lewo lub w prawo Nie wylecę poza ekran to pewne dbam o to Możesz mi podać pozycję ekranową oraz znak, jakim mam być Bohaterem dzisiejszego poznamy unikatowe fakty z życia przedstawicieli tego gatunku

Czwartek, 24 maja 2011 Tajemnice życia Runnerów ujawnione prawie wszystkie ymne szczegóły, tylko w dodatku Fakty IT gazeta Jak to możesz mi podać? codzienna Co jak to zwyczajnie Przecież wiesz jak mam na imię, to mnie zawołaj, ustal gdzie mam być na ekranie i jak mam wyglądać W ogóle to możesz mną sterować, zawołaj mnie i prześlij mi komunikat, rozumiesz, takie polecenie co mam zrobić Jak niby mam Ci przesyłać komunikat? Jaki ty jesteś no, niedoinformowany Przecież już Ci mówiłem, co potrafię Dokładnie komunikaty nazywają się: show, hide, moveup, movedown, moveleft, moverigt Dodatkowo mam swoją wewnętrzną pamięć i trzymam tam wszystko, co powinienem wiedzieć Pozycję przechowuję w komórkach o nazwie x i y, a znak jakim mam być, znaczy, wyglądać, w szufladce shape Chcesz, to mi coś tam wstaw Co łaska, byleby to było legalne Wiesz, my gwiazdy programów musimy uważać A skąd Ty to wszystko wiesz i potrafisz? Nauczył mnie tego programista Wymyślił, że będą Runner y, określił, co każdy Runner powinien wiedzieć, co powinien robić A potem nauczył nas, Runner ów jak to wszystko mamy robić Ja jestem Runner'em, to umiem to wszystko Każdy Runner umie to wszystko No, przydałoby się, żeby nauczyła nas jeszcze kilku rzeczy, no wiesz ale nie nauczył :( Strona 2 Wywiady

Czwartek, 24 maja 2011 Tajemnice życia Runnerów ujawnione prawie wszystkie ymne szczegóły, tylko w dodatku Fakty IT A skoro już tu jesteś mogę trochę Ciebie poużywać? gazeta codzienna Taaak, Wy to, jak zwykle, zawsze o jednym A dobra masz mieć, nie jestem mydełko, nie wymydlę się Ale ostrożnie, najpierw Ci wszystko wyjaśnię Jeżeli chcesz, żebym wiedział, że mam się pojawić np w 40-stej kolumnie 12-go wiersza, to piszesz w swoim programie: Rx = 40; Ry = 12; Zauważ, że piszesz najpierw moje imię, potem po kropce nazwę miejsca, gdzie przechowuję dane To miejsce nazywam polem Możesz do tego pola przypisać wartość np: 40, 12 To tak, jakbyś mi wkładał tą wartość do kieszeni Jeżeli chcesz, żebym pokazał się na ekranie piszesz: Rshow( I znowu, piszesz moje imię, potem po kropce nazwę polecenia, jakie mam wykonać To tak jakbyś do mnie wysyłał komunikat To wygląda trochę jak wywołanie funkcji w języku C, i rzeczywiście, na Twój komunikat odpowiadam wywołaniem funkcji, którą mam w siebie wbudowaną Taka funkcja nazywa się funkcją składową Strona 3 Wywiady

Czwartek, 24 maja 2011 Tajemnice życia Runnerów ujawnione prawie wszystkie ymne szczegóły, tylko w dodatku Fakty IT Jeżeli mam się przesunąć o jedno pole do góry, potem o jedno w lewo i jeszcze raz gazeta codzienna o jedno do góry, to piszesz: RmoveUp( RmoveLeft( RmoveUp( Jeżeli chcesz, żebym przeszedł po kwadracie: pięć kroków w prawo, pięć w dół, pięć w lewo i pięć w górę, to napiszesz np: steps; Rx = 1; Ry = 1; // Powiedz mi, skąd mam wystartować Rshow( // Powiedz żebym się pokazał for( steps = 5; steps > 0 ; steps-- ) // Pięć kroków w prawo RmoveRight( // Krok w prawo for( steps = 5; steps > 0 ; steps-- ) // Pięć kroków w dół RmoveDown( // Krok w dół for( steps = 5; steps > 0 ; steps-- ) // Pięć kroków w lewo RmoveLeft( // Krok w lewo for( steps = 5; steps > 0 ; steps-- ) // Pięć kroków w górę RmoveUp( // Krok w górę Strona 4 Wywiady

Czwartek, 24 maja 2011 Tajemnice życia Runnerów ujawnione prawie wszystkie ymne szczegóły, tylko w dodatku Fakty IT Czy możesz naszym czytelnikom wyjaśnić jak są zbudowane funkcje składowe, np show, hide? gazeta codzienna Mogę, ale mi się nie chce Zapytaj o to programistę Ja jestem od zasuwania na ekranie a nie od programowania Szkoda, ale i tak serdecznie dziękujemy za rozmowę Strona 5 Wywiady

Realizacja obiektowa najprostsza wersja Runner Runner R; R; // // Utworzenie Utworzenie obiektu obiektu oo nazwie nazwie RR ii typie typie Runner Runner Rx Rx == 40; 40; // // Ustalenie Ustalenie pozycji pozycji ii wygl wygląądu du Runnera'a Runnera'a RR Ry Ry == 12; 12; Rshape Rshape == '*'; '*'; clearscreen( clearscreen( Rshow( Rshow( // // Niech Niech RR si sięę poka pokażżee do do key key == getkey( getkey( switch( switch( key key )) case :: RmoveUp( case KEY_UP KEY_UP RmoveUp( break; break; case case KEY_DOWN KEY_DOWN :: RmoveDown( RmoveDown( break; break; case case KEY_LEFT KEY_LEFT :: RmoveLeft( RmoveLeft( break; break; case case KEY_RIGHT KEY_RIGHT :: RmoveRight( RmoveRight( break; break; while( while( key key!=!= KEY_ESC KEY_ESC // // Niech Niech RR si sięę przesunie przesunie ww gór góręę // // Niech Niech RR si sięę przesunie przesunie ww dół dół // // Niech Niech RR si sięę przesunie przesunie ww lewo lewo // // Niech Niech RR si sięę przesunie przesunie ww prawo prawo Programowanie obiektowe w C++ 20

Obiektowo vs strukturalnie Rx Rx == 40; 40; Ry = 12; Ry = 12; Rshape Rshape == '*'; '*'; Rshow( Rshow( RmoveUp( RmoveUp( RmoveDown( RmoveDown( Rhide( Rhide( X 1 2 3 4 5 79 80 1 2 3 4 5 Obiektowo Obiektowo * Y Strukturalnie Strukturalnie key, key, xx == 40, 40, yy == 12; 12; shape shape == '*'; '*'; 24 25 clearscreen( clearscreen( writecharxy( writecharxy( x, x, y, y, shape shape key = getkey( key = getkey( writecharxy( writecharxy( x, x, y, y, '' '' if( if( yy >> 11 )) --y; --y; if( if( yy << 24 24 )) ++y; ++y; Programowanie obiektowe w C++ 21

Obiektowo vs strukturalnie Obiektowo Obiektowo Wyodrębnij najważniesze obiekty w rozważanym problemie, ustal co powinny wiedzieć oraz co powinny umieć Naucz je tego wszystkiego Jeżeli problem tego wymaga, połącz obiekty w grupy, ustal szefa grupy jemu będziesz przekazywała polecenia, on będzie zarządzał pracą grupy Utwórz potrzebne obiekty, przekaż im konieczne informacje i każ im pracować wysyłając odpowiednie komunikaty, tak zby rozwiązać rozważany problem Strukturalnie Strukturalnie Ustal jakie dane są istotne dla rozważanego problemu, dobierz odpowiednie struktury do ich przechowywania Ustal jakie czynności powinny być wykonane na danych, jaka powinna być ich kolejność Jeżeli ustalone czynności są złożone, dziel je na podczynności tak długo, aż będą łatwe do zaprogramowania Zbuduj odpowiednie podprogramy Uaktywnij zaplanowane czynności w ustalonej kolejności, tak aby rozwiązać rozważany problem Programowanie obiektowe w C++ 22

Programming in the small programming in the large Programowanie proceduralne jest zorientowane na czynności wykonywane na strukturach danych Czynności są realizowane przez podprogramy (procedury i funkcje) grupowane zwykle w moduły Programowanie proceduralne wraz ze wzrostem rozmiaru programu zaczyna być coraz trudniejsze Coraz więcej podprogramów, coraz więcej modułów, coraz więcej nieuicyjnych i niejasnych powiązań pomiędzy podprogramami a strukturami danych Potrzebujemy Potrzebujemy porządku porządku ii hierarchii hierarchii trzeba trzeba jasno jasno określić określić kto kto ii za za co co jest jest odpowiedzialny odpowiedzialny W W programie programie muszą muszą się się pojawić pojawić kompetentne kompetentne podmioty, podmioty, zarówno zarówno te te zarządzające zarządzające (kadra (kadra managerska ) managerska ) jak jak ii te te zarządzane zarządzane W W programowaniu programowaniu podmiot, podmiot, czyli czyli ktoś ktoś to to obiekt obiekt Programowanie obiektowe w C++ 23

Obiektowość analiza, projektowanie, programowanie Obiektowość jest strategią pozwalającą zapanować na złożonym projektem Może być stosowana w każdej z faz realizacji systemu, zapewniając spójny i jednolity opis systemu w każdej z tych faz W wymiarze czysto programistycznym obiektowość jest strategią organizacji kodu potencjalnie złożonego oprogramowania Programowanie obiektowe nie stoi w sprzeczności z ideą programowania strukturalnego, stanowi raczej jego nadbudowę Zazwyczaj realizacja metod obiektów w systemie przebiega zgodnie z koncepcją programowania strukturalnego Programowanie Programowanie obiektowe obiektowe strategiczne strategiczne narzędzie narzędzie realizacji realizacji złożonych złożonych systemów systemów Programowanie Programowanie proceduralne proceduralne taktyczne taktyczne narzędzie narzędzie realizacji realizacji mniejszych mniejszych systemów, systemów, bądź bądź wybranych wybranych elementów elementów systemów systemów złożonych złożonych Programowanie obiektowe w C++ 24

Obiektowość przepis na program obiektowy raz jeszcze Wyodrębnij najważniesze obiekty w rozważanym problemie, ustal co powinny wiedzieć oraz co powinny umieć Jeżeli problem tego wymaga, połącz obiekty w grupy, ustal szefów grup im będziesz przekazywała polecenia, oni będą zarządzali pracą grupy Sprawdź czy istnieją odpowiadające Ci gotowe szablony dla potrzebnych obiektów Jeżeli tak to użyj ich, jeżeli nie to zbuduj własne szablony Utwórz potrzebne obiekty, przekaż im konieczne informacje i każ im pracować wysyłając odpowiednie komunikaty, tak zby rozwiązać rozważany problem Wyodrębniliśmy już najważniejszy obiekt w naszym problemie, wiadomo co powinien wiedzieć i co powinien umieć Jak go tego nauczyć? Programowanie obiektowe w C++ 25

Klasa Runner szablon do tworzenia obiektów Runner to nazwa klasy obiektów Wszystkie obiekty klasy Runner będą posiadały te same cechy i umiejętności Klasa swoją deklarację przypomina deklarację rekordu (struktury) Klasa będzie posiadała składowe, którymi będą pola i funkcje Deklaracja pustej klasy: class class Runner Runner public: public: }; }; Wszystkie Wszystkie elementy elementy zadeklarowane zadeklarowane w w sekcji sekcji public public są są dostępne dostępne dla dla tych, tych, którzy którzy chcą chcą używać używać obiektu obiektu klasy klasy Runner: Runner: Runner Runner R; R; Rx Rx == 40; 40; Ry Ry == 12; 12; Rshape Rshape == '*'; '*'; Programowanie obiektowe w C++ 26

Anatomia klasy Runner pola, czyli to co obiekt wie To, co obiekt wie o sobie i swoim otoczeniu pamiętane jest w jego polach Pola stanowią pamięć obiektu każdy obiekt ma własny zestaw niestatyczych pól Polami w klasie Runner są x i y opisujące ekranową pozycję obiektu, oraz shape opisujące wygląd obiektu class class Runner Runner public public :: x, x, y; y; char char shape; shape; }; }; Pola Pola w w obrębie obrębie klasy klasy deklaruje deklaruje się się podobnie podobnie jak jak pola pola w w obrębie obrębie typu typu rekordowego rekordowego Programowanie obiektowe w C++ 27

Anatomia klasy Runner funkcje składowe, czyli to co obiekt potrafi Każdy obiekt klasy Runner posiada funkcje składowe, które mogą być przez niego wywoływane Funkcje składowe pozwalają obiektowy działać, wykonywać akcje W trakcie wykonywania funkcji składowych obiekt korzysta zwykle z informacji zapisanej w jego polach class class Runner Runner public public :: x, x, y; y; char char shape; shape; show( show( hide( hide( }; }; moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( Prototypy Prototypy funkcji funkcji składowych, składowych, ich ich ciała ciała mogą mogą być być definiowane definiowane są są poza poza klasą klasą Programowanie obiektowe w C++ 28

Anatomia klasy Runner wywołanie funkcji a przesłanie komunikatu Podprogramy wbudowane w obiekt nazywa się w programowaniu obiektowym metodami, w języku C++ metody nazywane są funkcjami składowymi (ang member function) Wywołanie funkcji składowej nazywane jest często przesłaniem komunikatu do obiektu Obiekt "odpowiada" na komunikat wykonując kod odpowiedniej funkcji składowej switch( switch( key key )) case case KEY_UP KEY_UP :: RmoveUp( RmoveUp( break; break; case case KEY_DOWN KEY_DOWN :: RmoveDown( RmoveDown( break; break; case case KEY_LEFT KEY_LEFT :: RmoveLeft( RmoveLeft( break; break; case case KEY_RIGHT KEY_RIGHT :: RmoveRight( RmoveRight( break; break; Wywołanie Wywołanie funkcji funkcji składowych składowych dla dla obiektu obiektu R, R, inaczej inaczej przesłanie przesłanie komunikatu komunikatu do do obiektu obiektu Programowanie obiektowe w C++ 29

Anatomia klasy Runner implementacje funkcji składowych Właściwe definicje (implementacje zawierające konkretny kod) funkcji składowych umieszczone są zwykle poza definicją klasy Nazwa każdej funcji składowej zdefiniowanej poza klasą jest kwalifikowana nazwą klasy wraz z operatorem zakresu "::" class class Runner Runner show( show( hide( hide( }; }; Prototypy Prototypy (deklaracje) (deklaracje) funkcji funkcji składowych składowych Runner::show() Runner::show() Runner::hide() Runner::hide() Definicje Definicje (implementacje) (implementacje) funkcji funkcji składowych składowych Programowanie obiektowe w C++ 30

Anatomia klasy Runner implementacje funkcji show i hide Wyprowadź znak zapisany w polu code na pozycji zapisanej w polach x i y Runner::show() Runner::show() writecharxy( writecharxy( x, x, y, y, shape shape Wyprowadź spację na pozycji zapisanej w polach x i y, wymazującą zapisany tam znak Runner::hide() Runner::hide() writecharxy( writecharxy( x, x, y, y, '' '' Programowanie obiektowe w C++ 31

Anatomia klasy Runner implementacje funkcji show i hide Wyprowadź znak zapisany w polu code na pozycji zapisanej w polach x i y Runner::show() Runner::show() writecharxy( writecharxy( x, x, y, y, shape shape Do jakich x, y i shape odwołują się te funkcje? Wyprowadź spację na pozycji zapisanej w polach`azującą zapisany tam znak Runner::hide() Runner::hide() writecharxy( writecharxy( x, x, y, y, '' '' Programowanie obiektowe w C++ 32

Funkcje składowe wywoływane są dla konkretnego obiektu Runner Runner R; R; Rx Rx == 40; 40; Ry Ry == 12; 12; Rshape Rshape == '*'; '*'; R x: 40 y: 12 shape : * Rshow( Rshow( Każda niestatyczna funkcja składowa musi zostać wywołana dla jakiegoś obiektu klasy Runner Runner::show() Runner::show() writecharxy( writecharxy( xx,, yy,, shape shape W trakcie swojego działania funkcja składowa zwykle odwołuje się do pól obiektu, dla którego została wywołana Programowanie obiektowe w C++ 33

Wskaźnik this W obrębie niestatycznych funkcji składowych istnieje predefiniowany wskaźnik this, wskazujący na obiekt, dla którego działa funkcja składowa this Runner Runner R; R; Rx Rx == 40; 40; Ry Ry == 12; 12; Rshape Rshape == '*'; '*'; this == &R R x: 40 y: 12 shape : * Rshow( Rshow( Runner::show() Runner::show() writecharxy( writecharxy( this->x this->x,, this->y this->y,, this->shape this->shape Wykorzystanie wskaźnika this jest konieczne tylko w niewielkiej liczbie przypadków i nie powinno być nadużywane w tym przypadku użycie wskaźnika this jest niepotrzebne Programowanie obiektowe w C++ 34

Anatomia klasy Runner implementacje funkcji move Wymazanie znaku na bieżacej pozycji obiektu klasy Runner Ustalenie nowej pozycji, o ile jest ona prawidłowa Pokazanie znaku na nowej pozycji Runner::moveUp() Runner::moveUp() hide( hide( if( if( yy >> 11 )) --y; --y; show( show( Runner::moveLeft() Runner::moveLeft() hide( hide( if( if( xx >> 11 )) --x; --x; show( show( Runner::moveDown() Runner::moveDown() hide( hide( if( if( yy << 24 24 )) ++y; ++y; show( show( Runner::moveRight() Runner::moveRight() hide( hide( if( if( xx << 80 80 )) ++x; ++x; show( show( Programowanie obiektowe w C++ 35

Anatomia klasy Runner implementacje funkcji move W obrębie funkcji składowej (np moveup) można wywoływać inne funkcje składowe (np show, hide), działają one wtedy dla tego obiektu, dla ktorego została wywołana funkcja nadrzędna R Runner Runner R; R; x: 40 y: 12 shape : * Rx Rx == 40; 40; Ry Ry == 12; 12; Rcode Rcode == '*'; '*'; Runner::moveUp() Runner::moveUp() hide( hide( if( if( yy >> 11 )) --y; --y; show( show( RmoveUp( RmoveUp( Niestatycznych funkcje składowe "pracują" dla obiektu wskazywanego przez this Runner::moveUp() Runner::moveUp() this->hide( this->hide( if( if( yy >> 11 )) --y; --y; this->show( this->show( Programowanie obiektowe w C++ 36

Każdy egzemplarz klasy ma własne dane i wspólny kod funkcji Runner Runner pierwszy, pierwszy, drugi; drugi; pierwszy pierwszyx pierwszyx == 1; 1; pierwszyy = 1; pierwszyy = 1; pierwszyshape pierwszyshape == '@'; '@'; x: 1 y: 1 drugix drugix == 5; 5; drugiy drugiy == 5; 5; drugishape drugishape == '$'; '$'; pierwszyshow( pierwszyshow( drugishow( drugishow( shape : @ drugi x: 5 y: 5 shape : $ Runner::show() Runner::show() writecharxy( writecharxy( x, x, y, y, shape shape Każdy obiekt na własny zestaw pól niestatycznych, zgodnie z definicją klasy Każdy obiekt tej samej klasy wykonuje te same akcje, wywołując współdzielone funkcje składowe Programowanie obiektowe w C++ 37

Obiekt krótka definicja Istnieje wiele, różniących się od siebie definicji pojęcia obiekt i klasa Tutaj przyjmiemy następującą definicje: Obiekt Obiekt jest jest programowym programowym tworem, tworem, stanowiącym stanowiącym model model pewnego pewnego konkretnego konkretnego bytu bytu ze ze świata świata rzeczywistego, rzeczywistego, reprezentujący reprezentujący rzecz rzecz (obiekt (obiekt fizyczny), fizyczny), pojęcie pojęcie (obiekt (obiekt konceptualny) konceptualny) lub lub obiekt obiekt jest jest pewnym pewnym bytem bytem programistycznym programistycznym nie nie mający mający swojego swojego odpowiednika odpowiednika w w rzeczywistości rzeczywistości W sensie programistycznym obiekt jest zmienną złożoną, zawierającą dane różnego typu Jest zatem podobny do rekordu Od rekordu różni go zdolność do działania, polegająca na możliwości przesłania do obiektu komunikatu, na który reaguje on uruchomieniem wbudowanej weń funkcji składowej (metody) Programowanie obiektowe w C++ 38

Klasa krótka definicja Klasa Klasa to to szablon szablon określający określający jak jak obiekt obiekt jest jest zbudowany zbudowany ii co co potrafi potrafi W W szczególności szczególności klasa klasa zawiera zawiera informacje informacje oo nazwach, nazwach, typie typie ii reprezentacji reprezentacji pól, pól, deklaracje deklaracje ii definicje definicje funkcji funkcji składowych składowych oraz oraz informacje informacje dotyczące dotyczące relacji relacji ii powiązań powiązań zz innymi innymi klasami klasami W sensie programistycznym klasa jest dla obiektu tym, czym typ dla zmiennej W języku Object Pascal mówi się: zmienna obiektowa i typ obiektowy, w C++ i pokrewnych językach obiektowych mówi się po prostu obiekt i klasa Klasa ma charakter pierwotny aby utworzyć obiekt, najpierw należy zdefiniować jego klasę Programowanie obiektowe w C++ 39

Trzy podstawowe cechy obiektu Tożsamość (ang identity) Stan (ang state) Działanie, zachowanie (ang behavior) Programowanie obiektowe w C++ 40

Tożsamość obiektu Tożsamość (ang identity), pozwala na odróżnienie danego obiektu od każdego innego Tożsamość jest potrzebna, aby można było obiekt zlokalizować i wykorzystać Programista przypisuje obiektowi unikatową nazwę lub włącza go do identyfikowalnej kolekcji obiektów, lub odwołuje się do obiektu posługując się informacją o jego adresie w pamięci operacyjnej Runner Runner R; R; Rshow( Rshow( Runner Runner duchy[ duchy[ 33 ]; ]; for( i = 0; i for( i = 0; i << 3; 3; i++ i++ )) duchy[ duchy[ ii ]show( ]show( Runner Runner ** wsk wsk == new new Runner; Runner; wsk->show( wsk->show( Programowanie obiektowe w C++ 41

Stan obiektu Stan (ang state) obiektu w danym momencie opisany jest wartością jego pól Pola obiektu nazywane są również atrybutami lub składowymi danych Wartości pól oczywiście mogą się zmieniać w czasie wykonania programu, oznacza to, że obiekt zmienia swój stan Runner Runner R; R; Rx Rx == 1; 1; Ry Ry == 1; 1; Rshape Rshape == '@'; '@'; Rshow( Rshow( Rx Rx == 5; 5; Ry Ry == 5; 5; Rshape Rshape == '$'; '$'; Rshow( Rshow( Programowanie obiektowe w C++ 42

Zdolność obiektu do działania Zdolność do działania (ang behavior) opisuje operacje, które obiekt może wykonać Operacje są realizowane poprzez wykonanie metod zwanych w C++ funkcjami składowymi Metody są częścią obiektu i mogą być aktywowane wtedy, gdy obiekt otrzyma komunikat, zgodny z nazwą metody, która ma być wykonana Wykonanie metod zwykle zmienia stan obiektu poprzez zmianą wartości jego pól Runner Runner R; R; Rshow( Rshow( RmoveLeft( RmoveLeft( RmoveLeft( RmoveLeft( RmoveUp( RmoveUp( Rhide( Rhide( Programowanie obiektowe w C++ 43

Najważniejsze cechy obiektowego podejścia do programowania Abstrakcja (ang abstraction) Hermetyzacja (ang encapsulation) Dziedziczenie (ang inheritance) Polimorfizm (ang polymorphism) Programowanie obiektowe w C++ 44

Abstrakcja w sztuce to abstrakcjonizm, abstrakcjonizm, po co w programowaniu? Czy muszę wiedzieć wszystko? Czy potrzebne są wszystkie szczegóły? Rysunki: http://wwwturbosquidcom Programowanie obiektowe w C++ 45

Abstrakcja tworzenie komputerowych modeli Obiekt jest zwykle programową abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentującego rzecz (obiekt fizyczny) lub pojęcie (obiekt konceptualny) W programowaniu obiekt stanowi zatem komputerowy model jakiegoś obiektu ze świta rzeczywistego Obiekt-model zwykle jest uproszczony w stosunku do rzeczywistego pierwowzoru Jest tak, ponieważ trudno wiernie odwzorować rzeczywistość, lub to wierne odwzorowanie nie jest wcale potrzebne? The "Stanford Bunny" Programowanie obiektowe w C++ 46

Abstrakcja tylko to co istotne Abstrakcja pozwala postrzegać modelowaną rzeczywistość bez rozważania wszystkich szczegółów tej rzeczywistości oraz bez wnikania w jej wewnętrzną strukturę Stosowanie abstrakcji w programowaniu obiektowym prowadzi do tego, że obiekt powiniem posiadać tylko te elementy, które są istotne dla tworzonego systemu, elementy w danym momencie nieistotne powinny zostać pominięte Obiekty rzeczywiste Abstrakcyjny model analityczny Programowanie obiektowe w C++ 47

Cechy Marka Model Rok produkcji Nr rejestracyjny Kolor nadwozia Nr silnika Akcje Abstrakcja obiekt w rzeczywistości model obiekt w programie Podaj średnie spalanie Podaj przebieg Reprezentacja obiektowa Obiekty rzeczywiste Abstrakcyjny model analityczny Programowanie obiektowe w C++ 48

Abstrakcja prostota ale nie prostactwo Abstrakcja ma dostarczyć maksymalnie prostego i adekwatnego dla problemu opisu obiektu Obiekt ma być prosty, lecz nie prostacki Stosowaniu abstrakcji w programowaniu ma towarzyszyć antycypacja, czyli przewidywanie i wyprzedzenie potencjalnych zmian wymagań Antycypacja i abstrakacja mają dostarczać prostego opisu obiektu, jednocześnie elastycznego i podatnego na rozwój Programowanie obiektowe w C++ 49

Hermetyzacja czyli: mam to w, po co w programowaniu? Czy muszę wiedzieć co jest w środku aby tego używać? Czy muszę wiedzieć jak to działa aby tego używać? Programowanie obiektowe w C++ 50

Hermetyzacja totalny zez, czyli: spójrz z dwóch stron Nie wiem jak to działa, i nie chcę wiedzieć Chcę tego używać! Wiem jak to działa, ale Ty nie musisz tego wiedzieć aby używać Tak, dbam o swoje eresy! Programowanie obiektowe w C++ 51

Hermetyzacja w programowaniu Bardzo często programista wykorzystujący obiekt pewnej klasy nie pisze jej samodzielnie, wykorzystując klasy przygotowane przez innych Klasa powinna mieć jasno zdefiniowany erfejs, który wykorzystuje programista używający klasy Szczegóły reprezentacji pól oraz implementacji metod powinny zostać przez twórcę klasy oddzielone od erfejsu i niewidoczne dla programisty używającego klasy Tworzę! Użyyywaaaam! Interfejs Implementacja Klasa Programowanie obiektowe w C++ 52

Hermetyzacja Klasa bez hermetyzacji class class Runner Runner public: public: x, x, y; y; char char shape; shape; }; }; show( show( hide( hide( moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( Hermetyzację osiąga się to poprzez ukrycie (ang information hiding) pól obiektu oraz niektórych funkcji składowych w sekcjach prywatnych lub chronionych Dzięki hermetyzacji można modyfikować wewnętrzną reprezentację klasy, sposób jej działania w sposób przeźroczysty dla programisty używającego klasy Programowanie obiektowe w C++ 53

Niebezpieczeństwa braku hermetyzacji Runner Runner R; R; Rx = -400; Ry = 1200; Błędna Błędna pozycja pozycja ekranowa ekranowa Rshape = ' '; Nieszczęśliwie Nieszczęśliwie dobrany dobrany znak znak reprezentujący reprezentujący obiekt obiekt Rshow(? Bezpośredni Bezpośredni ii niekontrolowany niekontrolowany dostęp dostęp do do pól pól obiektu obiektu nie nie pozwala pozwala na na sprawdzenie sprawdzenie poprawności poprawności informacji informacji przekazywanych przekazywanych obiektowi obiektowi Programowanie obiektowe w C++ 54

Ukrycie pól dostęp za pomocą funkcji składowych Runner Runner R; R; RsetX( -400 RsetY( 1200 Ustalanie Ustalanie pozycji pozycji via via funkcje funkcje składowe składowe obiektu obiektu RsetShape( ' ' Ustalanie Ustalanie znaku znaku via via funkcje funkcje składowe składowe obiektu obiektu Rshow( Funkcje Funkcje składowe składowe zignorowały zignorowały niepoprawne niepoprawne parametry parametry ii ustaliły ustaliły wartości wartości domyślne: domyślne: xx == 1, 1, yy == 1, 1, shape shape == '*''*' Funkcje Funkcje składowe składowe mogą mogą kontrolować kontrolować poprawność poprawność danych danych przekazywanych przekazywanych obiektowi, obiektowi, odrzucając odrzucając wartości wartości niepoprawne, niepoprawne, przyjmując przyjmując ustalone ustalone arbitralnie arbitralnie wartości wartości domyślne domyślne dla dla pól pól Programowanie obiektowe w C++ 55

Publiczne i prywatne elementy klasy class class Runner Runner public public :: setx( setx( sety( sety( setshape( setshape( char char Runner Runner R; R; newx newx newy newy char char newshape newshape getx( getx( gety( gety( getshape( getshape( Interfejs Interfejs klasy klasy sekcja sekcja publiczna publiczna show( show( hide( hide( Tylko Tylko te te elementy elementy mogą mogą być być wykorzystywane wykorzystywane przez przez programistę programistę używającego używającego klasę klasę Runner Runner RsetX( RsetX( 10 10 RsetY( RsetY( 20 20 RsetShape('#' RsetShape('#' moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( private: private: x, x, y; y; char char shape; shape; }; }; Rx Rx == 10; 10; Ry Ry == 20; 20; Rshape Rshape == '#'; '#'; RisXOnScreen( RisXOnScreen( 100 100 bool bool isxonscreen( isxonscreen( newx newx bool bool isyonscreen( isyonscreen( newy newy Wewnętrzne Wewnętrzne elementy elementy klasy klasy sekcja sekcja prywatna prywatna Te Te elementy elementy mogą mogą być być wykorzystywane wykorzystywane wyłącznie wyłącznie przez przez funkcje funkcje składowe składowe klasy klasy Programowanie obiektowe w C++ 56

Podział publicznych funkcji składowych class class Runner Runner public public :: setx( setx( sety( sety( setshape( setshape( char char newx newx newy newy char char newshape newshape getx( getx( gety( gety( getshape( getshape( Modyfikatory Modyfikatory funkcje funkcje dokonujące dokonujące modyfikacji modyfikacji wartości wartości pól, pól, zapewne zapewne w w sposób sposób kontrolowany kontrolowany Akcesory Akcesory funkcje funkcje umożliwiające umożliwiające kontrolowane kontrolowane pobieranie pobieranie wartości wartości pól pól show( show( hide( hide( moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( private: private: x, x, y; y; char char shape; shape; }; }; bool bool isxonscreen( isxonscreen( newx newx bool bool isyonscreen( isyonscreen( newy newy Realizatory Realizatory funkcje funkcje realizujące realizujące właściwe właściwe dla dla klasy klasy usługi usługi Modyfikatory Modyfikatory ii akcesory akcesory mają mają charakter charakter administracyjno-kontrolny, administracyjno-kontrolny, realizatory realizatory to to esencja esencja działania działania klasy klasy Programowanie obiektowe w C++ 57

Modyfikatory wersja pierwsza Runner::setX( Runner::setX( newx newx )) if( if( isxonscreen( isxonscreen( newx newx )) )) xx == newx; newx; else else xx == 1; 1; // // Warto Wartośśćć domy domyśślna lna Runner::setY( Runner::setY( newy newy )) if( if( isyonscreen( isyonscreen( newy newy )) )) yy == newy; newy; else else yy == 1; 1; // // Warto Wartośśćć domy domyśślna lna Runner::setShape( Runner::setShape( char char newshape newshape )) if( if( newshape newshape >> 32 32 && && newshape newshape << 255 255 )) shape shape == newshape; newshape; else else shape shape == '*'; '*'; // // Warto Wartośśćć domy domyśślna lna Programowanie obiektowe w C++ 58

Modyfikatory wersja druga, bez ustawiania wartości domyślnych Runner::setX( Runner::setX( newx newx )) if( if( isxonscreen( isxonscreen( newx newx )) )) xx == newx; newx; Runner::setY( Runner::setY( newy newy )) if( if( isyonscreen( isyonscreen( newy newy )) )) yy == newy; newy; Runner::setShape( Runner::setShape( char char newshape newshape )) if( if( newshape newshape >> 32 32 && && newshape newshape << 255 255 )) shape shape == newshape; newshape; Programowanie obiektowe w C++ 59

Akcesory Runner::getX() Runner::getX() return return x; x; Runner::getY() Runner::getY() return return y; y; char char Runner::getShape() Runner::getShape() return return shape; shape; Programowanie obiektowe w C++ 60

Z hermetyzacją i bez, czyli jak z polem siłowym i bez niego class class Runner Runner public public :: setx( setx( sety( sety( setshape( setshape( char char newx newx newy newy char char newshape newshape show( show( hide( hide( getx( getx( gety( gety( getshape( getshape( show( show( hide( hide( class class Runner Runner public: public: x, x, y, y, shape; shape; }; }; moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( moveup( moveup( movedown( movedown( moveleft( moveleft( moveright( moveright( private: private: x, x, y; y; char char shape; shape; }; }; bool bool isxonscreen( isxonscreen( newx newx bool bool isyonscreen( isyonscreen( newy newy Programowanie obiektowe w C++ 61

Jeszcze dwie cechy obiektowego podejścia do programowania Osobny Osobny wykład wykład Dziedziczenie (ang inheritance) Polimorfizm (ang polymorphism) Osobny Osobny wykład wykład Programowanie obiektowe w C++ 62

Suplement obsługa klawiatury, klawisze sterujące, Borland conio Znaki sterujące na starszym bajcie (tzw scan code), zwykłe na młodszym (notacja szesnastkowa): enum enum KEY_CODES KEY_CODES KEY_UP == 0x4800, KEY_UP 0x4800, KEY_DOWN KEY_DOWN == 0x5000, 0x5000, KEY_LEFT KEY_LEFT == 0x4b00, 0x4b00, KEY_RIGHT KEY_RIGHT == 0x4d00, 0x4d00, KEY_ESC == 0x001b KEY_ESC 0x001b }; }; Przykładowa implementacja funkcji getkey (biblioteka conio firmy Borland) Znak ASCII pozostawiany jest na młodszym bajcie, sterujący przesuwany jest na starszy bajt: getkey() getkey() key key == getch( getch( return return (( key key == == 00 ))?? getch() getch() << << 88 :: key; key; Programowanie obiektowe w C++ 63

Suplement obsługa ekranu, Borland conio Implementacje funkcji czyszczenia ekranu oraz wyświetlania znaku na zadanej pozycji ekranu wersje wykorzystujące bibliotekę conio (kompilatory firmy Borland): clearscreen() clearscreen() clrscr( clrscr( writecharxy( writecharxy( x, x, y, y, char char cc )) gotoxy( gotoxy( x, x, yy putch( putch( cc Programowanie obiektowe w C++ 64

Suplement obsługa klawiatury, Borland + MINGW i GCC enum enum KEY_CODES KEY_CODES #ifdef #ifdef BORLANDC BORLANDC KEY_BLANK KEY_BLANK == 0x0000, 0x0000, #endif #endif #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION KEY_BLANK KEY_BLANK == 0x00e0, 0x00e0, #endif #endif KEY_UP KEY_UP KEY_DOWN KEY_DOWN KEY_LEFT KEY_LEFT KEY_RIGHT KEY_RIGHT KEY_ESC KEY_ESC };; };; == == == == == 0x4800, 0x4800, 0x5000, 0x5000, 0x4b00, 0x4b00, 0x4d00, 0x4d00, 0x001b 0x001b // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh getkey() getkey() key key == getch( getch( return return (( key key == == KEY_BLANK KEY_BLANK ))?? getch() getch() << << 88 :: key; key; Programowanie obiektowe w C++ 65

Suplement czyszczenie ekranu, Borland conio + MINGW i GCC // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh (Borland) (Borland) lub lub windowsh windowsh (MINGW (MINGW ii GCC) GCC) clearscreen() clearscreen() #ifdef #ifdef BORLANDC BORLANDC clrscr( clrscr( #endif #endif #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION COORD COORD lefttop lefttop == 0, 0, 00 }; }; CONSOLE_SCREEN_BUFFER_INFO CONSOLE_SCREEN_BUFFER_INFO consoleinfo; consoleinfo; DWORD DWORD writtenitems; writtenitems; numofcells numofcells == 80 80 ** 25; 25; HANDLE HANDLE consolehandle consolehandle == GetStdHandle( GetStdHandle( STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE if( if( GetConsoleScreenBufferInfo( GetConsoleScreenBufferInfo( consolehandle, consolehandle, &consoleinfo &consoleinfo )) )) numofcells numofcells == consoleinfodwsizex consoleinfodwsizex ** consoleinfodwsizey; consoleinfodwsizey; FillConsoleOutputAttribute( FillConsoleOutputAttribute( consolehandle, consolehandle, 0xf, 0xf, numofcells, numofcells, lefttop, lefttop, &writtenitems &writtenitems FillConsoleOutputCharacter( FillConsoleOutputCharacter( consolehandle, consolehandle, '' ', ', numofcells, numofcells, lefttop, lefttop, &writtenitems &writtenitems #endif #endif Programowanie obiektowe w C++ 66

Suplement wypisywanie znaku, Borland conio + MINGW i GCC // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh (Borland) (Borland) lub lub windowsh windowsh (MINGW (MINGW ii GCC) GCC) writecharxy( writecharxy( x, x, y, y, char char cc )) #ifdef #ifdef BORLANDC BORLANDC gotoxy( gotoxy( x, x, yy putch( putch( cc #endif #endif #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION COORD cursorpos; COORD cursorpos; DWORD DWORD written; written; cursorposx cursorposx == xx -- 1; 1; cursorposy cursorposy == yy -- 1; 1; SetConsoleCursorPosition( SetConsoleCursorPosition( GetStdHandle( GetStdHandle( STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE ), ), cursorpos cursorpos WriteConsole( WriteConsole( GetStdHandle( GetStdHandle( STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE ), ), &c, &c, 1, 1, &written, &written, 00 #endif #endif Programowanie obiektowe w C++ 67

Suplement wypisywanie napisu, Borland conio + MINGW i GCC // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh (Borland) (Borland) lub lub windowsh windowsh (MINGW (MINGW ii GCC) GCC) writestrxy( writestrxy( x, x, y, y, char char s[] s[] )) #ifdef #ifdef BORLANDC BORLANDC gotoxy( gotoxy( x, x, yy cputs( cputs( ss #endif #endif #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION COORD cursorpos; COORD cursorpos; DWORD DWORD written; written; HANDLE HANDLE consolehandle consolehandle == GetStdHandle( GetStdHandle( STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE cursorposx cursorposx cursorposy cursorposy == == xx yy --- 1; 1; 1; 1; SetConsoleCursorPosition( SetConsoleCursorPosition( consolehandle, consolehandle, cursorpos cursorpos WriteConsole( WriteConsole( consolehandle, consolehandle, s, s, strlen( strlen( ss ), ), &written, &written, 00 #endif #endif Programowanie obiektowe w C++ 68

Suplement wypisywanie liczby i double, double, Borland conio+mingw i GCC // // Wymaga Wymaga wł włąączenia czenia pliku pliku nagłówkowego nagłówkowego cstdio cstdio lub lub stdioh stdioh // // Wykorzystuje Wykorzystuje wcze wcześśniej niej zdefiniowan zdefiniowanąą funkcj funkcjęę writestrxy writestrxy writeintxy( writeintxy( x, x, y, y, ii )) char char s[ s[ 80 80 ]; ]; sprf( sprf( s, s, "%d", "%d", ii writestrxy( writestrxy( x, x, y, y, ss writedoublexy( writedoublexy( char char s[ s[ 80 80 ]; ]; sprf( sprf( s, s, "%g", "%g", writestrxy( writestrxy( x, x, y, y, x, x, y, y, double double dd )) dd ss Programowanie obiektowe w C++ 69

Suplement wyłączenie kursora tekstowego // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh (Borland) (Borland) lub lub windowsh windowsh (MINGW (MINGW ii GCC) GCC) cursoroff() cursoroff() #ifdef #ifdef BORLANDC BORLANDC setcursortype( _setcursortype( _NOCURSOR _NOCURSOR #endif #endif #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION CONSOLE_CURSOR_INFO CONSOLE_CURSOR_INFO cursorinfo; cursorinfo; HANDLE consolehandle HANDLE consolehandle == GetStdHandle( GetStdHandle( GetConsoleCursorInfo( GetConsoleCursorInfo( consolehandle, consolehandle, cursorinfobvisible cursorinfobvisible == false; false; SetConsoleCursorInfo( SetConsoleCursorInfo( consolehandle, consolehandle, #endif #endif STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE &cursorinfo &cursorinfo &cursorinfo &cursorinfo Programowanie obiektowe w C++ 70

Suplement włączenie kursora tekstowego // // Wymaga Wymaga wł włąączenia czenia pliku pliku conioh conioh cursoron() cursoron() #ifdef #ifdef BORLANDC BORLANDC setcursortype( _setcursortype( _NORMALCURSOR _NORMALCURSOR #endif #endif (Borland) (Borland) lub lub windowsh windowsh (MINGW (MINGW ii GCC) GCC) #ifdef #ifdef MINGW32_VERSION MINGW32_VERSION CONSOLE_CURSOR_INFO CONSOLE_CURSOR_INFO cursorinfo; cursorinfo; HANDLE consolehandle HANDLE consolehandle == GetStdHandle( GetStdHandle( GetConsoleCursorInfo( GetConsoleCursorInfo( consolehandle, consolehandle, cursorinfobvisible cursorinfobvisible == true; true; SetConsoleCursorInfo( SetConsoleCursorInfo( consolehandle, consolehandle, #endif #endif STD_OUTPUT_HANDLE STD_OUTPUT_HANDLE &cursorinfo &cursorinfo &cursorinfo &cursorinfo Programowanie obiektowe w C++ 71