PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

Podobne dokumenty
PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PARADYGMATY PROGRAMOWANIA Wykład 4

Dziedziczenie jednobazowe, poliformizm

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

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

Zaawansowane programowanie w C++ (PCP)

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wykład 5 Okna MDI i SDI, dziedziczenie

dr inż. Jarosław Forenc

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

Programowanie obiektowe

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Zaawansowane programowanie w języku C++ Programowanie obiektowe

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

TEMAT : KLASY DZIEDZICZENIE

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

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Wstęp do Programowania 2

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

C++ - [4-7] Polimorfizm

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Mechanizm dziedziczenia

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

Wykład 8: klasy cz. 4

Programowanie obiektowe w języku

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Programowanie obiektowe

Wykład 9: Metody wirtualne i polimorfizm

Dziedziczenie. Tomasz Borzyszkowski

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie 2. Język C++. Wykład 3.

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Pakiety i interfejsy. Tomasz Borzyszkowski

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

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

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

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

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

Podstawy Programowania Obiektowego

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

TEMAT : KLASY POLIMORFIZM

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe - 1.

Dziedziczenie jednobazowe, poliformizm, tablice wskaźników na obiekty

Programowanie 2. Język C++. Wykład 9.

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

PROE wykład 1. dr inż. Jacek Naruniec

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Szablony klas, zastosowanie szablonów w programach

Język C++ Programowanie obiektowe

Dziedziczenie & W slajdach są materiały zapożyczone z

Język C++ Różnice między C a C++

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

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

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Klasy abstrakcyjne i interfejsy

Polimorfizm. dr Jarosław Skaruz

Java Język programowania

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Materiały do zajęć VII

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Do czego służą klasy?

Programowanie obiektowe

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

Język programowania. Andrzej Bobyk

Rozdział 4 KLASY, OBIEKTY, METODY

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Transkrypt:

PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie dr inż. Jacek Naruniec

Kolokwium wykładowe Pierwsze kolokwium 6 kwietnia Drugie kolokwium 1 czerwca Kolokwium poprawkowe 8 czerwca

Operacje na plikach Pliki traktujemy tak samo jak strumienie cout, cin. Tworzymy obiekt strumienia plikowego wejściowego (ofstream), wyjściowego (ifstream) lub ogólnego (fstream).

Operacje na plikach

Przestrzenie nazw Używane zwykle aby: Uniknąć konfliktu nazw w różnych bibliotekach. Zwiększyć przejrzystość kodu.

Przestrzenie nazw Jeśli takie same przestrzenie istnieją w różnych miejscach kodu łączą się

Przestrzenie nazw

Przestrzenie nazw Jeśli wpiszemy: Oznacza to, że bez podania nazwy przestrzeni domyślnie korzystamy z PrzestrzenGienka, czyli:

Przestrzenie nazw Stąd nasze using namespace std; sprawia, że korzystamy z przestrzeni nazw std domyślnie. Nie musimy wtedy pisać std::cout tylko po prostu cout Tak samo string i std::string i inne Można mieć włączone wiele domyślnych przestrzeni nazw, ale wtedy nazwy elementów nie mogą się pokrywać, czyli:

Forward declaration Co będzie jeśli klasa Punkt będzie korzystała z klasy Wektor a klasa Wektor z klasy Punkt?

Forward declaration Jeśli w pliku.cpp zostanie dołączony Wektor.h, to w drugiej linijce (po #pragma once) mamy: include Punkt.h -> Punkt.h będzie miał w drugiej linijce #include Wektor.h Kompilator nie wejdzie w Wektor.h, bo na początku jest #pragma once które wymusza fakt, że nie dołączymy tego pliku 2 razy. W rezultacie nagłówek ten będzie pominięty, powrócimy do dalszej kompilacji Punkt.h W przesunowektor korzysta z klasy Wektor która jeszcze nigdzie nie została zadeklarowana i zgłasza błąd.

Forward declaration W pliku Wektor.cpp mamy: #include Wektor.h Kompilujemy plik Wektor.cpp W bloczkach kolejność, w której będzie zaglądał do plików kompilator: 3 4 1 2 5 dalej nie pójdzie, bo pragma once! 6 7 8 błąd, bo nigdy nie doszliśmy do definicji Wektor

Forward declaration Zamiast dołączać Wektor.h i Punkt.h powiemy tylko kompilatorowi, że będzie coś takiego jak Punkt i jak Wektor (bez żadnych szczegółów):

Forward declaration

Dyrektywy preprocesora Preprocesor przetwarza plik przed kompilacją. Podmienia/interpretuje dyrektywy/bloki poprzedzone znakiem #. #define ZMIENNA #ifdef ZMIENNA Cośtam cośtam ten kod preprocesor włączy w kod #else Coś innego coś innego tego kodu preprocesor nie włączy w kod #endif wynik działania preprocesora Cośtam cośtam ten kod preprocesor włączy w kod

Dyrektywy preprocesora Stała _DEBUG jest automatycznie definiowana przy wyborze trybu kompilacji DEBUG w Visual Studio. W większości środowisk definicje preprocesora globalne dla całego projektu wpisujemy w opcjach projektu pod pojęciem preprocesor definitions lub podobnym.

Jedna z najważniejszych cech programowania obiektowego! Jest to uszczegółowienie klasy. Uszczegóławiając klasę dodajemy jedynie te elementy, które pojawiają się w nowym obiekcie.

Klasa OknoProgramu (różnice także w uruchomieniu albo nieblokujące albo blokujące) Okno programu Okno dialogowe Okno edycyjne Rozszerzone okno dialogowe Okno hasła

Okno dialogowe nie jest częścią okna programu jest jego uszczegółowieniem Podobnie okno hasła nie jest częścią okna edycyjnego Itd

Okno programu stanowi bazę dla pozostałych okien (w rzeczywistości będzie zawierać więcej elementów) Te metody będą dotyczyły każdego okna To są zmienne, które definiują okno każdego typu (także dialogowe, hasła, edycyjne)

Okno dialogowe rozszerza działanie okna o przyciski (powinna być jeszcze zawartość itp.): To znaczy, że dziedziczy po klasie OknoProgramu Identycznie zdefiniowana metoda jak w OknoProgramu

Rozszerzone okno dialogowe rozszerza okno dialogowe o możliwość ustawienia koloru tła. Nie ma metody pokazokno()! ale będzie ona dostępna dla tej klasy (z klasy bazowej)

Okno edycyjne rozszerza działanie OknaProgramu o pole edycyjne (ale nie zawiera żadnych przycisków)

OknoHasla jest uszczegółowieniem okna edycyjnego kropki zamiast liter i dodatkowy przycisk OK. Kod aby hasło nie występowało jawnie w pamięci.

Klasy asortymentu sklepu internetowego: Towar Komputer Telewizor Telefon LCD Plazma Komórkowy Stacjonarny

Klasa Detektor Detektor Detektor ruchu Detektor twarzy Detektor twarzy Haar Detektor twarzy LBP

Obiekt Detektor (bardzo ogólny)?

Detektor ruchu dziedziczy po detektorze i daje wyniki w postaci maski pikseli które się poruszyły obraz maska ruchu

Detektor twarzy dziedziczy po detektorze i daje wyniki w postaci tablicy obiektów typu Twarz. Nie implementuje żadnej konkretnej metody, jest ciągle ogólny, ale wiemy jaki wynik chcemy otrzymać. wykryte twarze obraz

DetektorTwarzyHaar rozszerza działanie detektora twarzy, implementując konkretną metodę detekcji (opartą na cechach Haara)

DetektorTwarzyLBP rozszerza działanie detektora twarzy, implementując konkretną metodę detekcji (cechy Local Binary Patterns - LBP)

Implementacja klasy Detektor:

Najprostsze wykorzystanie obiektu bazowego: Po co nam taki obiekt?? przecież on w zasadzie nic nie robi i nie ma żadnej sensownej funkcjonalności. My przecież chcemy mieć narzędzie do detekcji

Implementacja klasy DetektorTwarzy, zaczniemy od konstruktora: Te zmienne dotyczą wszystkich detektorów więc chcemy też z nich korzystać! Rozwiązaniem jest trzeci tryb dostępu (przy private i public) tryb chroniony, czyli protected

Sekcja protected oznacza, że z metod i zmiennych mogą korzystać klasy pochodne, ale nie można korzystać z nich z zewnątrz:

Przy dostępie do zmiennych protected: tutaj nie ma problemu Tu zgodnie z założeniem nie można tego zrobić

Od tego momentu wszystkie składowe klasy (czyli zwykle większość, jeśli nie wszystkie) które chcemy aby były dziedziczone umiejscawiamy w sekcji protected. Tu w sumie zbędne (bo dalej nie ma dziedziczenia), ale nie zaszkodzi

Proste wykorzystanie obiektów:

Najważniejsza cecha dziedziczenia polimorfizm.

Polimorfizm: Słowo virtual określa, że funkcja zachowuje się inteligentnie, tzn. wywołuje się funkcja odpowiadająca klasie stworzonego obiektu a nie klasy wskaźnika.

Polimorfizm Przy virtual (funkcje wirtualne) uruchamiana jest funkcja najbardziej odpowiadająca danej klasie. Jest to jeden z najistotniejszych elementów dziedziczenia.

A co jeśli w DetektorTwarzyHaar nie ma zdefiniowanej funkcji uruchom? Uruchomi się najbliższa możliwa, czyli: Detektor virtual bool uruchom uruchom() Funkcja wirtualna, szukamy dalej DetektorTwarzy bool uruchom Funkcja wirtualna, szukamy dalej DetektorTwarzyHaar Nie znaleziono, więc wywoła się funkcja z klasy DetektorTwarzy

Metody i klasy abstrakcyjne. Metoda abstrakcyjna to funkcja, której nazwa i parametry są zadeklarowane a jej definicja (ciało) już nie. Oznacza to, że funkcja jest wirtualna ale nie jest zdefiniowana w klasie Detektor (ale jest zdefiniowana w klasach pochodnych)

Efekt posiadania funkcji wirtualnej: Klasa która ma metody(choćby jedną) abstrakcyjne staje się klasą abstrakcyjną, której obiektu nie da się utworzyć.

Mimo, że nie można utworzyć klasy Detektor, to można utworzyć wskaźnik na obiekt klasy Detektor:

Tak samo nie ma sensu definicja funkcji w klasie DetektorTwarzy: To też będzie metoda i klasa abstrakcyjna. Nie ma słowa virtual, bo wirtualność jest dziedziczona jeśli funkcja była wirtualna w klasie Detektor to będzie i tutaj.

Nasz main obecnie:

Analogicznie można tworzyć wskaźniki na DetektorTwarzy:

Konstruktory/desktruktory Konstruktory uruchamiają się od klasy bazowej do klas pochodnych, destruktory odwrotnie W rezultacie, w tym przypadku, z trzech konstruktorów otrzymujemy jeden obiekt.

Każda klasa powinna dbać o własną czystość pamięci. Jeśli klasa DetektorTwarzy tworzy jakąś tablicę przez new to i w tej klasie powinno być jej usunięcie (a nie w bazowej ani innej!).:

Usunięcie obiektu z wykorzystaniem polimorfizmu: Brakuje dwóch destruktorów!

Aby umożliwić usunięcie obiektu z wykorzystaniem polimorfizmu, destruktor musi być wirtualny:

Można także bezpośrednio odwoływać się do funkcji klasy bazowej danego obiektu, np.:

Co jeśli funkcja jest zdefiniowana w klasie pochodnej, nie ma jej w klasie bazowej a my mamy wskaźnik na klasę bazową (uffff. ;-))? Detektor nie ma funkcji zmienparametryhaar!

Możemy rzutować wskaźnik Detektor na wskaźnik klasy pochodnej, wtedy mamy dostęp do jej funkcji:

Wirtualne funkcje: Okno programu pokazokno wirtualny destruktor? Okno dialogowe Okno edycyjne Rozszerzone okno dialogowe Okno hasła

Okna Windows (np. w MFC): Akcje na oknach wywołują pewne funkcje. Jeśli mamy swoją klasę okna możemy przedefiniować te funkcje (bo są wirtualne). Przykłady funkcji witualnych: OnOk() OnCancel() OnClick(Button &b) OnMove()

Ćwiczenie: Obiekt bazowy (OB) void funkcja1() virtual void funkcja2() Obiekt pochodny 1 (OP1) Obiekt pochodny 2 (OP2) virtual void funkcja1() void funkcja2() Obiekt pochodny 3 (OP3) void funkcja1() Które funkcje się uruchomią jeśli mamy: - Wskaźnik na klasę OB., - Wskaźnik na klasę OP1, OP2, OP3 - Obiekt klasy OB - Obiekt klasy OP1 - Obiekt klasy OP3 Za każdym razem wywołujemy funkcja1 i funkcja 2

Które konstruktory/destruktory i w jakiej kolejności się uruchomią? Obiekt bazowy 1(OB1) Obiekt bazowy 2(OB2) Obiekt pochodny 1 (OP1) Obiekt pochodny 2 (OP2)

Możliwe jest także dziedziczenie wielokrotne (np. Laptop dziedziczy po komputerze i urządzeniu). Najważniejsze w dziedziczeniu jest: Polimorfizm Możliwość rozszerzania klas bazowych oszczędność kodu