Abstrakcyjny typ danych



Podobne dokumenty
Szablony. Szablony funkcji

Szablony funkcji i szablony klas

Dziedziczenie. Ogólna postać dziedziczenia klas:

TEMAT : KLASY DZIEDZICZENIE

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Programowanie obiektowe. Wykład 5. C++: szablony

Wstęp do Programowania 2

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

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

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

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

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

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

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

Szablony funkcji i klas (templates)

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

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.

Wstęp do programowania obiektowego, wykład 7

Wprowadzenie do szablonów szablony funkcji

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

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

Język C++ Programowanie obiektowe

Wykład 8: klasy cz. 4

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

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.

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Mechanizm dziedziczenia

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Język C++ wykład VIII

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Programowanie, część I

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

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

Stos liczb całkowitych

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

Programowanie Obiektowe i C++

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

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

Plik klasy. h deklaracje klas

Dziedziczenie. dr Jarosław Skaruz

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe w języku

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Materiały do zajęć VII

Wykład 5: Klasy cz. 3

Wykład 4: Klasy i Metody

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

Programowanie Obiektowe i C++

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

Podstawy Programowania Obiektowego

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

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

Podstawy Programowania Obiektowego

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

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

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

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

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

Programowanie obiektowe - 1.

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

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

C++ - [4-7] Polimorfizm

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

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

Efekty uboczne błędów

Wprowadzenie do programowanie obiektowego w języku C++

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

Programowanie obiektowe w C++ Wykład 12

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

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie w Internecie. Java

Pakiety i interfejsy. Tomasz Borzyszkowski

Identyfikacje typu na etapie. wykonania (RTTI)

Zaawansowane programowanie w języku C++ Klasy w C++

Transkrypt:

Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są kompletne oraz wyłączne (nie ma możliwości wykonywania na wartościach typu operacji spoza zestawu); bezpośredni dostęp do składowych takiej struktury nie jest możliwy; Termin abstrakcyjny jest związany z definicją metod niezależną od implementacji

Abstrakcyjny typ danych Jednym z prostszych abstrakcyjnych typów danych jest stos. Operacjami wykonywanymi na stosie mogą być: new:-> S - konstruktor pustego stosu push: T, S -> S - położenie elementu typu T na stos S top: S -> T - odczytanie wierzchołka stosu S popoff: S -> S - zdjęcie elementu ze stosu S (wynikiem jest stos) pop: S -> T - zdjęcie elementu ze stosu S (wynikiem jest element) isempty: S -> boolean - sprawdzenie, czy stos S jest pusty

Abstrakcyjny typ danych Pojęcie abstrakcyjnego typu danych jest bliskie pojęciu klasy w językach programowania obiektowego. Klasa może być postrzegana jako implementacja abstrakcyjnego typu danych. Klasa może przesłaniać złożoną swoją strukturę (podobnie jak ADT) i udostępniać jedynie pewien publiczny interfejs (zestaw operacji)

Klasy abstrakcyjne Klasa abstrakcyjna - klasa, która nie ma instancji; służy do wyprowadzania hierarchii dziedziczenia (służy jako nadklasa, grupująca pewne ogólne własności); nie wprowadza definicji (wszystkich) metod Klasa konkretna - klasa, która może mieć instancje; musi mieć zdefiniowane wszystkie metody Klasa jest klasą abstrakcyjną, jeżeli zawiera niezdefiniowaną funkcję wirtualną(pure virtual function) lub dziedziczy taką funkcję i nie dostarcza jej implementacji. Niezdefiniowane funkcje wirtualne są deklarowane następująco: virtual typ nazwa([parametry]) = 0; Termin abstrakcyjny jest tu związany z faktem, że zabrania się tworzenia instancji takiej klasy, a sama klasa służy jedynie do określenia pewnego wspólnego interfejsu dla zbioru jej podklas Klasa

Klasy abstrakcyjne - przykład class Instrument { public: virtual char* Identity( ) { return name; } virtual void play() = 0; // funkcja abstrakcyjna protected: char *name; }; Konkretni potomkowie klasy Instrument powinni dostarczyć implementacji wszystkich metod abstrakcyjnych

Klasy abstrakcyjne Klasy abstrakcyjne nie mogą być używane jako: zmienne lub składowe klasy typy parametrów funkcji typy wynikowe funkcji przy jawnej konwersji Jeżeli konstruktor klasy abstrakcyjnej wywołuje funkcję abstrakcyjną (bezpośrednio lub pośrednio) wynik wywołania jest nieokreślony (w VC++ błąd linkera); Funkcje abstrakcyjne mogą być wywoływane w innych metodach, niż konstruktor Konstruktory i destruktory mogą wywoływać zwykłe funkcje (nie wirtualne)

Abstrakcyjne destruktory class base { public: base() {} virtual ~base() = 0; }; base::~base() { cout<< "Base destructor\n"; } class derived : public base { public: derived() {} ~derived(){} }; // dla wirtualnych destruktorów i tak musimy //dostarczyć implementację Pusta implementacja funkcji wirtualnej zapewnia, że istnieje co najmniej 1 implementacja tej funkcji.

Szablony Szablony są mechanizmem ponownego wykorzystania kodu (reuse) W przypadku funkcji ponownie wykorzystany jest algorytm W przypadku klas ponownie wykorzystane są wszystkie składowe Deklaracja szablonu specyfikuje zbiór parametryzowanych klas lub funkcji Deklaracja szablonu ma postać: template < [typelist] [, [arglist]] >declaration Lista parametrów szablonu jest oddzieloną przecinkami listą typów (identyfikatorów klas lub nazw typów) oraz ewentualnie wartości, które mają być wykorzystane w treści szablonu Przykład szablonu funkcji: template <classt> T min( T a, T b ){ return ( a < b )? a : b; }

Szablony Użycie szablonu wymaga jego konkretyzacji (ustalenia wartości dla wszystkich generycznych parametrów) Konkretyzacja może odbywać się: Niejawnie (na podstawie typów parametrów aktualnych) Jawnie (przez podanie typów parametrów aktualnych) Niejawna konkretyzacja funkcji ma miejsce w czasie jej wywołania; wartości parametrów generycznych są ustalane na podstawie parametrów aktualnych

Szablony Przykład niejawnej konkretyzacji szablonu funkcji min: int a = 5, b = 10; double a = 5.0, b = 10.0; cout<< min(a,b); cout << min(a,b); Jawna konkretyzacja wymaga, aby, a po nazwie funkcji, w nawiasach <>, zdefiniować wartości aktualne dla parametrów generycznych Przykład jawnej konkretyzacji szablonu funkcji: char x= a ; int y = 66; cout << min<char>(x,y); // wymagana konwersja z int do char

Szablony Szablony można specjalizować, zmieniając ich działanie w zależności od typu parametrów, na którym działają Specjalizacja szablonu template<classt>void Demo( T a ) {} // definicja funkcji szablonowej template<> void Demo[<typ>](typ a) {} // specjalizacja szablonu dla //konkretnego typu Przykłady różnych specjalizacji szablonów template<classt>voidf(t t){} template<>voidf<char>(chart){} template<>voidf(doublet){} // specjalizacja funkcji f dla typu char // specjalizacja funkcji f dla typu double

Szablony Parametrem szablonu może być argument, który nie jest typem Argumenty, które nie opisują typów (non-type) podlegają następującym ograniczeniom: Typ argumentu jest typem całkowitym, wyliczeniowym, referencją lub wskaźnikiem W kodzie szablonu nie można modyfikować wartości argumentu, ani pobierać jego adresu Przy konkretyzacji szablonu wartość parametru musi być stałą Przykład szablonu funkcji z parametrem, który nie jest typem template<classt,int zakres>int szukaj(t tablica[], T co){} const int ile =sizeof(tab1)/sizeof(int); cout<< szukaj<int, ile>(tab1,2) <<endl;

Szablony funkcji Zastosowanie szablonów funkcji dla własnych typów (klas) może wymagać przeciążenia odpowiednich operatorów: template <classt> T min(t a, T b){ return( a < b )? a : b; } classx { public: X(int a=0):a(a){} int operator<(x& b); int a; }; X a,b,c; c = min(a,b);

Szablony Kolejność dopasowywania wywołań funkcji szablonowych przez kompilator (mechanizm rozstrzygania przeciążeń): Tworzona jest lista funkcji kandydujących: o tej samej nazwie Spośród funkcji kandydujących wybierane są te, które mają odpowiednią listę parametrów istnieje niejawna sekwencja konwersji, zawierająca przypadek dokładnego dopasowania każdego typu parametru aktualnego do typu odpowiedniego parametru formalnego Spośród różnych funkcji, wybierana jest taka, której argumenty są najlepiej dopasowane (zwykłe funkcje mają pierwszeństwo przed wzorcami, konwersja przez promocję,np. char lub short w int, float w double, konwersja standardowa, np. int w char, long w double, konwersja zdefiniowana przez użytkownika) Jeżeli uda się znaleźć szablon - generowana jest odpowiednia wersja funkcji; jeżeli szablonu nie zgłaszany jest błąd

Szablony klas Szablon klasy służy do tworzenia rodziny klas, które operują na pewnym typie (typach) - parametrach szablonu Notacja UML template<class T1, int i> class TempClass {} template<typedef T1, int i > class TempClass {}

Szablony klas - przykład template <class T,int i> // szablon klasy ma 2 parametry class TempClass // 1-szy typ T, 2-gi wartość typu int { // Wartością aktualną T może być dowolny typ public: // Wartością aktualną i może być stały int TempClass(void); ~TempClass(void); int MemberSet( T a, int b ); private: T Tarray[i]; int arraysize; };

Szablony klas Definicja funkcji klasy szablonowej: template<deklaracja_parametrów_szablonu> typ_wyniku nazwa_klasy<parametry_szablonu>::nazwa_składowej ([parametry]) {... } template<classt,inti> int TempClass<T, i>::memberset(t a, int b){ if (b>=0 && b<arraysize) return (Tarray[b]==a); else return-1; }

Szablony klas Konkretyzacja klasy szablonowej ma postać (konkretyzacja niejawna): klasa_szablonowa<parametry_aktualne> obiekt_klasy_konkretnej; TempClass<int, 10> klasa1; // parametry aktualne szablonu: int, 10 TempClass<char, 5> klasa2; // parametry aktualne szablonu: char, 5 Notacja UML

Szablony klas Szablony klas Konkretyzacja klasy szablonowej ma postać (konkretyzacja jawna): template class klasa_szablonowa<parametry_aktualne> obiekt_klasy_konkretnej; template classtempclass<char, 3>; // parametry aktualne szablonu: char, 3 template classklasa<int>; // parametry aktualne szablonu: int Taka deklaracja musi być umieszczona w tej samej przestrzeni nazw, co definicja szablonu; Klasa jest generowana zawsze, nawet, gdy nie tworzymy obiektów tej klasy Zostaną wygenerowane klasy: TempClass<char, 3> Klasa<int>

Szablony klas Szablon klasy może definiować domyślne parametry typu: template <classt2 = typ> deklaracja template <classt=char> class Kwadrat { void rysuj(t znak){} }; Możliwe konkretyzacje takiego szablonu: Kwadrat<int> klasa1(4); klasa1.rysuj(4); Kwadrat<> klasa2(5); klasa2.rysuj('*'); // wykorzystanie typu domyślnego

Szablony klas jako składowe

Szablony klas i dziedziczenie

Szablony klas i dziedziczenie Dziedziczymy Definiujemy Zwykłą klasę Klasą szablonową Szablon klas Zwykłą klasę TAK TAK niemożliwe Szablon klas TAK TAK TAK Klasą szablonową TAK TAK niemożliwe

Szablony klas i dziedziczenie template <class T1> class para { protected: T1 lewy; T1 prawy;.. }; template <class T2> class wspolrzedne : public para<float> { T2 atr1; int atr2; public: wspolrzedne (T2 c, float x=0, float y=0) : para<float>(x,y), atr1(c) {atr2 = 1; }. };

Szablony Szablony są często używane: Do tworzenia klas obsługujących kolekcje (np. stos), które manipulują na danych dowolnych typów Jako klasy bazowe, jak i typy obiektów składowych Zalety szablonów: łatwe do napisania łatwe do zrozumienia type-safe - kompilator wykonuje wszelkie niezbędne sprawdzenia parametrów Szablony znacząco redukują rozmiar kodu źródłowego i zwiększają jego elastyczność nie zmniejszając bezpieczeństwa związanego ze sprawdzaniem typów

Szablon funkcji korzystający z obiektów klasy szablonowej template <class param> class wieza {char *nazwa; param dana; public: wieza(char *na, param d) { nazwa = na; dana = d; } friend ostream &operator << (ostream &s, wieza<param> &ob); }; prosty szablon funkcji template <class param> void prostafun(wieza<param> obiekt) {...} template <class typ> ostream &operator<< (ostream & strum, wieza<typ> ob.) { strum << ob.nazwa <<, dana = << ob.dana << endl; return strum; }

Obiekt klasy szablonowej składnikiem innego szablonu klasy template <class typ> class kubek {...}; template <class t> class trojka { kubek<float> lewy; kubek<t> srodkowy; kubek<t> prawy; }; main() {... trojka<char> ob1; trojka<long> ob2;... }

Zagnieżdżenie definicji klasy w szablonie klas template<class typ1, class typ2> class podstawowa { typ1 skl1;... class wewnetrzna {public: typ1 lewy; typ2 prawy; void pisz() {} }; wewnetrzna pomocnik; wewnetrzna *wskpom; public: podstawowa (typ1 a, typ2 b) { skl1 = a; pomocnik.lewy = a; pomocnik.prawy = b; }... }

Przyjaźń a szablony klas Jeden wspólny przyjaciel template<int stala> class A { int skl(stala); void funpryw( ) {...}; // deklaracja przyjazni friend class zap_kl; friend void zap_fun(); };

Przyjaźń a szablony klas Każdy ma swojego przyjaciela template<class typ> class A { int skl_p; public: A (typ cos) : skl_p (cos) {... } void funpryw( ) {...}; // deklaracja przyjazni z funkcjami (parametryzowany argument) friend void fun_zap(a<typ> obj); // deklaracja przyjazni z klasami szablonowymi friend class B<typ> }; szablon funkcji zaprzyjaznionych template <class typ> void fun_zap (A<typ> obj) {...} szablon klas przyjaciół template<class typ> class B { A<typ> *skl_d; public: B(A<typ> *wsk) : skl_d (wsk) {...} };