Plik klasy. h deklaracje klas

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

TEMAT : KLASY POLIMORFIZM

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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.

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

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

Programowanie obiektowe w C++ Wykład 12

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

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

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

Wstęp do Programowania 2

dr inż. Jarosław Forenc

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

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

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

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

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Zaawansowane programowanie w C++ (PCP)

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

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

PARADYGMATY PROGRAMOWANIA Wykład 2

C++ - [4-7] Polimorfizm

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

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

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie obiektowe w języku

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

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

Mechanizm dziedziczenia

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

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

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

Programowanie Obiektowew języku C++ Zadania L4

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

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

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

Wyliczanie wyrażenia obiekty tymczasowe

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

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

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

Programowanie Obiektowe i C++

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

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Wstęp do Programowania 2

Konstruktor kopiujacy

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Podstawy Programowania Obiektowego

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

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

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

Wstęp do programowania obiektowego, wykład 7

Listy powiązane zorientowane obiektowo

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

PARADYGMATY PROGRAMOWANIA Wykład 3

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

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

Materiały do zajęć VII

Mechanizm dziedziczenia

Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

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

Pola i metody statyczne

tel Konsultacje www

Techniki Programowania wskaźniki 2

Abstrakcyjny typ danych

Programowanie obiektowe i zdarzeniowe

Język C++ wykład VIII

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

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

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

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

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

Obsługa wyjątków. Język C++ WW12

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

Programowanie Obiektowew języku C++ Zadania L4

Programowanie w języku C++

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

Operatory na rzecz typu TString

Programowanie obiektowe

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Programowanie obiektowe

Programowanie obiektowe język C++

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

Wzorce funkcji (szablony)

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

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

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

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

Programowanie Procedurale

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

Transkrypt:

Plik klasy. h deklaracje klas KLASY DLA PRZYKŁADÓW Z POLIMORFIZMEM enum dim r1 = 1, r2, r3; class figura public: static int const maxliczbafigur; = 100; static int liczbafigur; dim rn; rodzaj przestrzeni int n; liczba wierzchołków int kr; liczba krawędzi int dimxy; rozmiar tablicy wierzcholkow double* xy; wskaźnik do tablicy wierzcholkow int opislng; długość opisu (z uwzgl. \0) char* opis; opis figury figura(dim = r1, int = 1, int = 0, double* = NULL, char* = NULL); virtual ~figura() liczbafigur--; cout << "To ja - destruktor klasy figura" << endl; Funkcja wirtualna ma w całej hierarchi klas tę samo składnię, tzn. nazwę, liczbę, kolejność i typ parametrów oraz ten sam typ zwracany

; virtual double pole() = 0; void piszfigura(); konstruktor nie może być wirtualny, ale można utworzyć funkcje składowe spełniające tę samą rolę virtual figura* konstr_domn() = 0; virtual figura* konstr_kopi() = 0; class trojkat : public figura public: trojkat(double* = NULL, char* = "domniemany trojkat"); virtual ~trojkat(); wszystkie ponizsze funkcje MUSZA!!!! być zdefiniowane, gdyż w przeciwnym przypadku klasa dziedziczy je z klasy figura i staje się abstrakcyjna (w klasie figura są one czysto wirtualne) double virtual pole(); virtual figura* konstr_domn() return new trojkat(); virtual figura* konstr_kopi() return new trojkat(*this); ;

class czworokat : public figura public: czworokat(double* = NULL, char* = "domniemany czworokat"); virtual ~czworokat(); double virtual pole(); virtual figura* konstr_domn() return new czworokat(); virtual figura* konstr_kopi() return new czworokat(*this); ; Plik figura.cpp definicje metod #include "stdafx.h" using namespace std; KLASA FIGURA int const figura::maxliczbafigur = 100; inicjalizacja już została dokonana podczas deklaracji klasy dla składników statycznych jest to możliwe jeśli posiadają przydomek const int figura::liczbafigur = 0;

figura::figura(dim rn_, int n_, int kr_, double* xy_, char* str): rn(rn_), n(n_), kr(kr_), dimxy(rn_*n_) double *wxy, *wxy_; liczbafigur++; xy = new double[dimxy]; wxy = xy; if (xy_ == NULL) for(int i=0; i<dimxy; ++i, ++wxy) *wxy = 0.; else wxy_ = xy_; for(int i=0; i<dimxy; ++i, ++wxy, ++wxy_) *wxy = *wxy_; opislng = strlen(str) + 1; opis = new char[opislng]; strcpy(opis, str); cout << "Klasa figura - wskaznik this: " << this << endl; cout << "Klasa figura - pole: " << pole() << endl; double figura::pole() funkcja czysto wirtualna, a jednak może zostać wykonana gdy mimo wszystko nastąpi wczesne wiązanie i polimorfizm nie zadziała

cout << "Nieokreslona figura - brak pola" << endl; return -1.; void figura::piszfigura() cout << endl; cout << " Nazwa: " << opis << endl; cout << " Przestrzen: " << rn << endl; cout << " Liczba wezlow: " << n << endl; cout << " Liczba bokow: " << kr << endl; cout << " Pole powierzchni: " << pole() << endl; cout << "Wspolrzedne wezlow: " << endl; double *wxy = xy+1; for (int i=0; i<n; ++i, wxy+=2) cout << " (" << *(wxy-1) << ", " << *wxy << ") " << endl; KLASA TROJKAT trojkat::trojkat(double* xy_, char* str) : figura(r2, 3, 3, xy_, str) cout << "Klasa trojkat - wskaznik this: " << this << endl;

trojkat::~trojkat() cout << "Kasuje " << this->opis << endl; delete [] xy; delete [] opis; liczbafigur--; double poletrojk(double *xy) return 0.5*fabs(xy[2]*xy[5] + xy[1]*xy[4] + xy[0]*xy[3] - xy[2]*xy[1] - xy[4]*xy[3] + xy[5]*xy[0]); virtual double trojkat::pole() w definicji funkcji virtualnej już nie podaje się słowa virtual double trojkat::pole() return poletrojk(xy); KLASA CZWOROKAT czworokat::czworokat(double* xy_, char* str) : figura(r2, 4, 4, xy_, str) cout << "Klasa czworokat - wskaznik this: " << this << endl;

czworokat::~czworokat() cout << "Kasuje " << this->opis << endl; delete [] xy; delete [] opis; liczbafigur--; double czworokat::pole() int dlxy = rn*(n+1); double *nxy = new double[dlxy]; for (int i = 0; i < rn*n; i++) *(nxy+i) = *(xy+i); dopisanie współrzędnych pierwszego wierzchołka czworokąta na końcu (po ostatnim) *(nxy+dlxy-2) = *nxy; *(nxy+dlxy-1) = *(nxy+1); 1-szy trojkat - wierzchołki 1, 2, 3 2-gi trojkat - wierzchołki 3, 4, 5 = 1 double p = poletrojk(nxy) + poletrojk(nxy+4); delete [] nxy; return p;

Plik Polimorfizm - funkcja main #include "stdafx.h" using namespace std; double pole(figura& ob) return ob.pole(); int main(array<system::string ^> ^args) utworzenie obiektu klasy figura jest niemożliwe klasa figura jest klasą abstrakcyjną ze względu na istnienie funkcji czysto wirtualnych np. double pole() = 0 figura xxx; - błąd!!!! WCZESNE WIĄZANIE trojkat a; a.piszfigura();

double t1[6] = 0., 0., 1., 0., 0., 1.; trojkat b(t1, "moj trojkat"); b.piszfigura(); double t2[8] = 0., 0., 1., 0., 2., 2., 0., 1.; czworokat c(t2, "moj czworokat"); c.piszfigura(); PÓŹNE WIĄZANIE Wskaźnik do obiektu klasy figura cout << endl << "Wskaznik do obiektow typu figura: " << endl; figura *wskfig; wskfig = &b; cout << "Pole figury " << wskfig->opis << " wynosi " << wskfig->pole() << endl; wskfig = &c; cout << "Pole figury " << wskfig->opis << " wynosi " << wskfig->pole() << endl; Referencja do obiektu klasy figura cout << endl << "Referencja do obiektow typu figura: " << endl; cout << "Pole figury " << b.opis << " wynosi " << pole(b) << endl; cout << "Pole figury " << c.opis << " wynosi " << pole(c) << endl; WCZESNE WIĄZANIE - polimorfizm nie działa

Wywołanie na rzecz obiektu cout << endl << "Wywolanie na rzecz obiektu: " << endl; cout << "Pole figury " << c.opis << " wynosi " << c.pole() << endl; Zastosowanie kwalifikatora zakresu cout << endl << "Zastosowanie kwalifikatora zakresu: " << endl; cout << "Pole figury " << wskfig->figura::opis << " wynosi " << wskfig- >figura::pole() << endl; Wywołanie konstruktora i destruktora klasy podstawowej jeśli w ich wnętrzu znajduje się wywołanie funkcji wirtualnej, to i tak zostanie wywołana jej wersja właściwa dla klasy podstawowej, choć wskaźnik this będzie się odnosił do klasy pochodnej) Konstruktor nie może być wirtualny Poniżej wywołanie funkcji będących namiastkami konstruktorów figura *wskzewzoru = wskfig->konstr_kopi(); cout << endl << "Funkcja zastepujaca konstruktor kopiujacy: " << endl; cout << "Pole figury " << wskzewzoru->opis << " wynosi " << wskzewzoru->pole() << endl; figura *wskfignowy = wskfig->konstr_domn(); cout << endl << "Funkcja zastepujaca konstruktor domniemany: " << endl; cout << "Pole figury " << wskfignowy->opis << " wynosi " << wskfignowy->pole() << endl;

cout << endl << " Liczba obiektow typu figura: " << wskfig->liczbafigur << endl; system("pause"); return 0;