(Średnio) zaawansowane programowanie w C++ (ZPR)

Podobne dokumenty
( rednio) zaawansowane programowanie w C++ (ZPR)

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP)

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ ]

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Zaawansowane programowanie w C++ (PCP)

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

Kurs rozszerzony języka Python

Spis treści. Wprowadzenie 15

Kurs rozszerzony języka Python

3. Biblioteka standardowa Pythona

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

Python. Wprowadzenie. Jolanta Bachan

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

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

Zaawansowane programowanie w C++ (PCP)

Przegląd języka Python. Łukasz Anwajler

Programowanie obiektowe

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Współczesne Narzędzia Obliczeniowe - Python


Technologie cyfrowe semestr letni 2018/2019

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Programowanie w Internecie. Java

Język ludzki kod maszynowy

Programowanie Obiektowe i C++

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

Zaawansowany kurs języka Python

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

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

PARADYGMATY PROGRAMOWANIA Wykład 3

1 Atrybuty i metody klasowe

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

Zaawansowany kurs języka Python

Programowanie obiektowe

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

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

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

Programowanie w języku C++

Kurs WWW. Paweł Rajba.

Język Python (3) Język Python (3) 1/35

Wykład 8: klasy cz. 4

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Wyjątki (exceptions)

Język Python (2) Język Python (2) 1/36

Język C++ wykład VIII

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

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

Java Język programowania

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

Programowanie obiektowe

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

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

Podstawy Programowania Obiektowego

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

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

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

Microsoft IT Academy kurs programowania

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe zastosowanie języka Java SE

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

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

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

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

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

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

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

Zaawansowane programowanie w C++ (PCP)

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

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

Dziedziczenie jednobazowe, poliformizm

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

Podstawy programowania obiektowego

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

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

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

Python. Skąd taka nazwa? Kurs systemu UNIX 1

Programowanie obiektowe

Wprowadzenie do języka Java

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

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

Język C++ Programowanie obiektowe

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

Szablony klas, zastosowanie szablonów w programach

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe - 1.

Wykład 7: Pakiety i Interfejsy

Podstawy otwartych języków programowania Przechowywanie danych

Języki i metody programowania Java. Wykład 2 (część 2)

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Transkrypt:

(Średnio) zaawansowane programowanie w ++ (ZPR) Wykład 6 - łączenie ++ i a, powtórzenie Robert Nowak 2019L (Średnio) zaawansowane programowanie w ++ (ZPR) 1/45

Łączenie i ++ Kompilatory muszą być zgodne (w taki sam sposób reprezentować typy wbudowane) problemy: dekorowanie nazw dla linkera struktury danych funkcja main operacje na stercie (Średnio) zaawansowane programowanie w ++ (ZPR) 2/45

dekorowanie nazw linker w nazwy nie mogą być przeciążane w ++ mogą nazwa funkcji jest dekorowana przez kompilator ++ (name mengling, name decoration) extern "" { //Zapobiega dekorowaniu nazw int funkcja(int a, int b) /*... */ //Zapobiega dekorowaniu nazw jeżeli jest kompilowane przez ++ #ifdef cplusplus extern "" { #endif int funkcja( int a, int b) /*... */ #ifdef cplusplus #endif (Średnio) zaawansowane programowanie w ++ (ZPR) 3/45

funkcja main i struktury danych Należy wybierać implementację main z ++, ponieważ zapewnia ona prawidłową inicjację składowych statycznych zapewnia wołanie destruktorów dla składowych statycznych Struktury danych (tylko te, które są dostępne w ): typy wbudowane, POD struktury, które nie mają funkcji wirtualnych obiekty, które zostały powołane przez new powinny być zwalniane przez delete pamięć zaalokowana przez malloc powinna być zwalniana przez free (Średnio) zaawansowane programowanie w ++ (ZPR) 4/45

interpretowany, interaktywny język programowania Software Fundation, www.python.org programowanie funkcyjne, obiektowe i strukturalne dynamiczna kontrola typów brak enkapsulacji zarządzanie pamięcią przez garbage collection dokumentacja w kodzie źródłowym zmienna liczba argumentów funkcji i metod zaznaczanie bloków przez wcięcia (Średnio) zaawansowane programowanie w ++ (ZPR) 5/45

- hello world uruchomienie interpretera python >>> print Hello world! # comments after hash >>> quit() skrypt utworzenie pliku o nazwie hello.py print Hello world! uruchomienie skryptu python hello.py (Średnio) zaawansowane programowanie w ++ (ZPR) 6/45

, obliczenia - wykorzystanie interpretera do obliczeń >>> 2+2 4 >>> (2+3*3)/2 # arytmetyka całkowita 5 >>> width = 20.1 >>> height = 5/2.0 # arytmetyka rzeczywista >>> width * height 50.25 >>> x = y = 0 # równoczesne przypisanie do dwóch obiektów >>> n # odwołanie się do niezdefiniowanego obiektu Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name n is not defined None oznacza brak wartości x = None (Średnio) zaawansowane programowanie w ++ (ZPR) 7/45

, obliczenia (2) % modulo (5 % 2 = 1) Funkcje wbudowane ** potęga (2 ** 3 = 8) int() konwersja (podłoga) float() konwersja Math module (import math) math.pi π = 3.1415... math.e e = 2.718281... math.sqrt() pierwiastek kwadratowy math.log(), math.log10(), funkcje wykładnicze i logarytmiczne math.exp(x), math.pow(x,y) dodatkowo funkcje trygonometryczne i inne Google: python math or http://docs.python.org/library/math.html (Średnio) zaawansowane programowanie w ++ (ZPR) 8/45

- napis >>> s = Hello # pojedyncze lub podwójne cudzysłowy >>> print s Hello >>> print s + "world" # konkatenacja przez operator + Hello world >>> print s + man *3 # powtórzenia napisów za pomocą * Hello man man man >>> u Hello # unicode >>> print u Section \u00a7 # unicode character >>> unicode( xyz, utf-8 ) # ASII, UTF-8, UTF-16, Latin-1, etc. Indeksowanie >>> s = Hello >>> s[0] # pierwsza litera, tutaj H >>> s[-1] # ujemy indeks oznacza liczenie od końca, tutaj o >>> s[1:3] # substring, tutaj el >>> s[:3] # pierwszy indeks jest domyślnie równy 0 >>> s[1:] # drugi indeks jest domyślnie równy długości napisu >>> len(s)# długość napisu (Średnio) zaawansowane programowanie w ++ (ZPR) 9/45

- lista l = [ Hello, world, 1, 2] # elementy listy mogą być różnych typów l[0] # indeks używany dla list len(l) # liczba elementów w liscie l[1:3] # wycinanie dla list (podobnie jak dla napisów) l + [ X, Y ] # łączenie list print l[2:]*3 # powtórzenia dla list l[0] = cat # l = [ cat, world, 1, 2 ] l.append( mouse ) # dodaje element na koniec listy l[0:2] = [ xxx ] # modyfikuje listę, może dodać lub usunąć elementy l[:] = [ ] # czyści listę l = [ 1, 2, 3 ] m = [ l, [ 4 ] ] # m jest listą list # [[1, 2, 3], [4]] (Średnio) zaawansowane programowanie w ++ (ZPR) 10/45

- słownik len(d) - liczba obiektów w słowniku k in d - czy d zawiera klucz k d[k] - zwraca wartość dla klucza k, jeżeli brak klucza zgłasza wyjątek KeyError d[k] = val - dodaje parę klucz-wartość, jeżeli poprzednio istniała para jest nadpisywana d = { one :1, three :3 # tworzy słownik d[ two ] = 1 # d = { one :1, three :3, two :1 d[ two ] = 2 # d = { one :1, three :3, two :2 d = { John Smidth : +48 213-234-22, Mark Brown : +01 234 121212, Max Sugar : +853 0123456 (Średnio) zaawansowane programowanie w ++ (ZPR) 11/45

- instrukcje sterujące Bloki są oznaczane przez wcięcia x = int(raw_input("enter integer:")) if x < 0: print Negative elif x == 0: print Zero else: print Positive while x > 0: # pętla while x = x - 1 print x animals = [ dog, cat, mouse ] for a in animals: # pętla for for i in range(len(a)): # range generuje listę, np. [0, 1, 2] print a[:i] (Średnio) zaawansowane programowanie w ++ (ZPR) 12/45

Programowanie strukturalne w ie Nowa funkcja definiowana za pomocą def Przykład: wieże Hanoi, animacja: http://en.wikipedia.org/wiki/file: Tower_of_Hanoi_4.gif a b c a b c a b c a b c def hanoi(in_tower, out_tower, tmp_tower, nr): "documentation of the function" # narzędzia używają tego opisu if nr == 1: print move 1 from + in_tower + to + out_tower return hanoi(in_tower, tmp_tower, out_tower, nr - 1) print move + str(nr) + from + in_tower + to + out_tower hanoi(tmp_tower, out_tower, in_tower, nr - 1) return (Średnio) zaawansowane programowanie w ++ (ZPR) 13/45

- wyjątki 1 def f(i): 2 if i == 2: 3 raise Exception( i==2 ) 4 else: 5 g(i-1) 6 def g(i): 7 while i > 0: 8 i = i - 1; 9 f(i) 10 def h(i): 11 try: 12 g(i) 13 except Exception: 14 pass 15 h(5) linia 15 h(5) 10 i=5 11 * 12 * g(5) 06 i=5 07 * 08 i=4 09 * f(4) 01 i=4 02 * 04 * 05 * g(3) 06 i=3 07 * 08 i=2 (Średnio) 09 zaawansowane programowanie * w ++ f(2) (ZPR) 14/45

Programowanie funkcyjne w ie >>>g= lambda x: x**2 # tworzy funkcję anomimową >>>g(4) 16 >>>add = lambda a, b: a+b >>>add(2,3) 5 >>># pierwszy argument to warunek >>>print filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6, 7]) [2, 4, 6] >>># domknięcie (closure) - zapamiętuje otoczenie funkcji >>>def callback(msg):... print msg >>>words = [ do, re, mi ] >>>func = [] >>>for w in words:... func.append( lambda p = w: callback(p) ) >>>func[0]() do (Średnio) zaawansowane programowanie w ++ (ZPR) 15/45

- moduł (plik) Moduł - plik z rozszerzeniem py zawierający kod a wewnątrz modułu jego nazwa jest zmienną name gdy moduł jest uruchomiony jako skrypt python module.py jego nazwą jest main definicje mogą być użyte w innym module import name Funkcje: dir(module-name) - zawartość modułu help(module-name) - dokumentacja modułu Moduł może zawierać sekcję wykonywaną gdy po raz pierwszy moduł jest użyty def f() # definicja if name == main : # nie uruchamia gdy moduł jest dołączany # sekcja wykonywana gdy moduł jest wołany jako skrypt (Średnio) zaawansowane programowanie w ++ (ZPR) 16/45

- programowanie obiektowe definicja klasy po słowie kluczowym class class Mylass: default_x = 1 # składowa statyczna def init (self, x, y=0): # metoda inicjująca self.x = x # składowa obiektu self.y = y # składowa obiektu def f(self): # metoda return self.x język upraszcza wołanie metody inicjującej obiekt, np. m=mylass(23), wtedy m.x==23 język upraszcza dostęp do atrybutu lub wołanie metody, np. m.f() to to samo co Mylass.f(m) pierwszy atrybut metody jest wymieniony jawnie, przyjęło się go nazywać self (Średnio) zaawansowane programowanie w ++ (ZPR) 17/45

- (wielo)dziedziczenie # dziedziczenie class Derivedlass(Baselass): # definicja klasy pochodnej jeżeli atrybut (lub metoda) nie jest zdefiniowana w danej klasie klasy bazowe są przeszukiwane (rekursywnie) wszystkie metody zachowują się jak wirtualne w ++ można wołać metody wprost Baselass.method(self, arguments) brak enkapsulacji (wszystkie metody i składowe są publiczne) isinstance(obj, class) bada, czy obj is typu class issubclass(classa, classb) bada, zcy classa jest pochodna po classb (Średnio) zaawansowane programowanie w ++ (ZPR) 18/45

- programowanie obiektowe (2) Można dodawać metody w czasie działania class A(): def init (self): self.i = 0 def f(self, p): print A::f, i= + str(self.i) + p= + str(p) >>>a=a() >>>a.f(1) A::f, i=0 p=1 >>>a. class.g = lambda self: self.f( ala ) >>>a.g() A::f, i=0, p=ala (Średnio) zaawansowane programowanie w ++ (ZPR) 19/45

Pakiety Pakiet - katalog zawierający moduły a i moduł specjalny (inicjujący) o nazwie init.py server/ # przykład pakietu init.py # inicjacja config/ # pakiet składowy init.py models.py # moduł simulator/ init.py camera.py radar.py nazwy modułów wykorzystują kropki import server.simulator.camera # import module Plik init.py musi istnieć, nawet gdy nie jest potrzebna inicjacja pakietu (wielkość pliku=0) (Średnio) zaawansowane programowanie w ++ (ZPR) 20/45

Ścieżka poszukiwań modułów Gdy name jest dołączany, poszukuje się plików w katalogach: lokalnym, zawierającym uruchomiony skrypt innych, katalogi są przechowywane w zmiennej sys.path import sys print sys.path # drukuje aktualne ścieżki aby dodać ścieżkę, można ustawić zmienną środowiskową PYTHONPATH (Średnio) zaawansowane programowanie w ++ (ZPR) 21/45

Standardowe pakiety a - dostarczane wraz z interpreterem dokumentacja: http://docs.python.org/library/ string re struct difflib StringIO cstringio textwrap codecs unicodedata stringprep fpformat datetime calendar collections heapq bisect array sets sched mutex Queue weakref UserDict UserList UserString types new copy pprint repr numbers math cmath decimal fractions random itertools functools operator os.path fileinput stat statvfs filecmp tempfile glob fnmatch linecache shutil dircache macpath pickle cpickle copy_reg shelve marshal anydbm whichdb dbm gdbm dbhash bsddb dumbdbm sqlite3 zlib gzip bz2 zipfile tarfile csv onfigparser robotparser netrc xdrlib plistlib hashlib hmac md5 sha os io time argparse optparse getopt logging logging.config logging.handlers getpass curses curses.textpad curses.ascii curses.panel platform errno ctypes select threading thread dummy_threading dummy_thread multiprocessing mmap readline rlcompleter subprocess socket ssl signal popen2 asyncore asynchat email json mailcap mailbox mhlib mimetools mimetypes MimeWriter mimify multifile rfc822 base64 binhex binascii quopri uu HTMLParser sgmllib htmllib htmlentitydefs xml.parsers.expat xml.dom xml.dom.minidom xml.dom.pulldom xml.sax xml.sax.handler xml.sax.saxutils xml.sax.xmlreader xml.etree.elementtree webbrowser cgi cgitb wsgiref urllib urllib2 httplib ftplib poplib imaplib nntplib smtplib smtpd telnetlib uuid urlparse SocketServer BaseHTTPServer SimpleHTTPServer GIHTTPServer cookielib ookie xmlrpclib SimpleXMLRPServer DocXMLRPServer audioop imageop aifc sunau wave chunk colorsys imghdr sndhdr ossaudiodev gettext locale cmd shlex Tk Tkinter ttk Tix ScrolledText turtle IDLE Packages pydoc doctest unittest translation test test.test_support bdb pdb ommands Profilers hotshot timeit trace sys sysconfig future_builtins warnings contextlib abc atexit traceback gc inspect site user fpectl distutils code codeop rexec Bastion imp imputil zipimport pkgutil modulefinder runpy parser ast symtable symbol token keyword tokenize tabnanny pyclbr py_compile compileall dis pickletools i wiele innych (Średnio) zaawansowane programowanie w ++ (ZPR) 22/45

automatyczna instalacja pakietów kilka tysięcy pakietów dostępnych w repozytorium Package Index. pypi.python.org Dostępne są narzędzia do automatycznego instalowania pakietów przechowywanych w tym repozytorium zainstalować setuptools dla odpowiedniej wersji interpretera http://pypi.python.org/pypi/setuptools#downloads run the egg: sh setuptools-version.egg Następnie: pip install package_name wersja pakietu jest wybierana automatycznie (najczęściej najnowsza) (Średnio) zaawansowane programowanie w ++ (ZPR) 23/45

Łączenie ++ i a (Średnio) zaawansowane programowanie w ++ (ZPR) 24/45

Potrzeba użycia różnych języków w aplikacjach (patrz wykład 1) System komputerowy zawsze: ma ograniczenia czasowe, więc tworzenie całości powinno być możliwie szybkie posiada pewne elementy, które są wąskim gardłem - powinny być zaimplementowane wydajnie (20% kodu) System komputerowy często: posiada pewne elementy, których autor nie chce udostępniać (kod ukryty przed użytkownikiem) posiada pewne fragmenty, które powinny być dostępne dla użytkownika (aby dostosować aplikację do indywidualnych potrzeb, np. konfiguracja) (Średnio) zaawansowane programowanie w ++ (ZPR) 25/45

Łączenie ++ i a powody rozszerzania a w ++ kod wykonywany jest szybciej wykorzystanie istniejącego kodu kod jest ukryty przed użytkownikiem powody osadzania a w ++ brak potrzeby kompilacji wykorzystanie bibliotek a kod dostępny dla użytkownika Interfejsy: API Boost (Średnio) zaawansowane programowanie w ++ (ZPR) 26/45

Przykłady Rozszerzanie a w ++: utworzenie biblioteki dzielonej zawierającej funkcje w ++ import biblioteki do a i wykonanie Przykład: hello world Osadzanie a w ++ (Boost ): Przykład: embedding (Średnio) zaawansowane programowanie w ++ (ZPR) 27/45

Dodatkowa lektura (http://staff.elka.pw.edu.pl/~rnowak2/rnbib.html): R. Nowak, Biblioteka Boost.. Łączenie ++ i a, Software Developer s Journal, 2011. R. Nowak, Wydajne i elastyczne programy. Łączenie ++ i a przy pomocy Boost., Programista, 2012. R. Nowak, Komunikacja z serwerem w aplikacjach flex, Programista, no. 7, pp. 52 54, 2012. R. Nowak, Aplikacje internetowe wykorzystujące python. biblioteki flup, web2py, django, Programista, no. 13, pp. 66 69, 2013. (Średnio) zaawansowane programowanie w ++ (ZPR) 28/45

Przykładowe zadania (Średnio) zaawansowane programowanie w ++ (ZPR) 29/45

Przykładowe zadania Wzorce projektowe Wzorce kreacyjne (tworzenie obiektów) fabryka obiektów fabryka abstrakcyjna prototyp singleton wzorce strukturalne (budowa obiektów) adapter fasada proxy kompozyt dekorator wzorce czynnościowe (współpraca pomiędzy obiektami) polecenie, komenda wizytator wielometoda obserwator iterator (Średnio) zaawansowane programowanie w ++ (ZPR) 30/45

Przykładowe zadania i uzupełnienie wiadomości o ++ stałość, const, mutable polimorfizm, funkcje wirtualne, dziedziczenie wielobazowe dynamiczna informacja o typie różne strategie obsługi błędów, mechanizm wyjątków sprytne wskaźniki: std::unique_ptr, std::auto_ptr (wycofywany) std::shared_ptr, boost::shared_ptr std::weak_ptr, boost::weak_ptr boost::scoped_ptr, boost::scoped_array boost::intrusive_ptr referencja do r-wartości w ++11 (r-value reference) (Średnio) zaawansowane programowanie w ++ (ZPR) 31/45

Przykładowe zadania Przykładowe zadania (Średnio) zaawansowane programowanie w ++ (ZPR) 32/45

Przykładowe zadania Zad1 - zaproponuj implementację readfromstream wczytuje ona kolekcję pracowników ze strumienia (hierarchia taka jak na rysunku). Deklaracje są zaproponowane poniżej. enum PracownikTyp { SEZNONOWY, SPEJALISTA, KIEROWNIK; typedef boost::shared_ptr<pracownik> PracownikPtr; typedef std::vector<pracownikptr> Pracownicy; Pracownicy readfromstream(std::istream& iys); (Średnio) zaawansowane programowanie w ++ (ZPR) 33/45

Przykładowe zadania typedef boost::shared_ptr<pracownik> PracownikPtr; class UnknownTypeException : public std::exception { ; class PracownikFactory { public: typedef PracownikPtr (*PracownikreateFun)(); static PracownikFactory& getinstance() { static PracownikFactory instance; return instance; void regist(int t, PracownikreateFun fun) { creators_.insert( std::pair<int,pracownikreatefun>(t,fun) ); PracownikPtr create(std::istream& is) { int typ; is >> typ; reators::const_iterator it = creators_.find(typ); if(it!= creators_.end() ) return it->second(); else throw UnknownTypeException(); private: typedef std::map<int,pracownikreatefun> reators; reators creators_; ; (Średnio) zaawansowane programowanie w ++ (ZPR) 34/45

Przykładowe zadania Zad1 - przykładowe rozwiązanie typedef std::vector<pracownikptr> Pracownicy; Pracownicy readfromstream(std::istream& is) { Pracownicy out; while(is) { try { PracownikPtr p = PracownikFactory::getInstance().create(is); out.push_back(p); catch(unknowntypeexception&) { return out; (Średnio) zaawansowane programowanie w ++ (ZPR) 35/45

Przykładowe zadania class File { std::string name_; int size_; public: File(std::string n, int s) : name_(n), size_(s) { std::string getname() const { return name_; int getsize() const { return size_; ~File(){ ; class Dir { typedef File* hild; typedef std::vector<hild> hildren; std::string name_; hildren ch_; public: Dir(const std::string& n) : name_(n) { std::string getname() const { return name_; int getsize() const { int size = 0; for(hildren::const_iterator i=ch_.begin(); i!=ch_.end();++i) size += (*i)->getsize(); return size; void add(hild el) { ch_.push_back(el); ~Dir() { for(hildren::iterator i=ch_.begin(); i!=ch_.end();++i) delete *i; ; (Średnio) zaawansowane programowanie w ++ (ZPR) 36/45

Przykładowe zadania Zad3 - podać napis, który zostanie wydrukowany M m; D1* d1 = &m; cout << m.f() << d1->f() << static_cast<d2&>(m).f() << static_cast<b&>(m).f() << flush; struct B { virtual int f() { return 1; ; struct D1 : virtual public B { virtual int f() { return 2; ; struct D2 : virtual public B { ; struct M : public D1, public D2 { virtual int f() { return 3; ; (Średnio) zaawansowane programowanie w ++ (ZPR) 37/45

Przykładowe zadania try { h(); catch(const std::exception&) { std::cout << c ; catch(const E& e) { std::cout << e.c_; Ile razy zostanie wywołany destruktor klasy X Jeżeli definicja typu PX zostanie zmieniona na następującą: typedef X* PX;, to ile razy zostanie wywołany destruktor klasy X struct E : public std::exception { char c_; E(char c):c_(c){ ; struct X { char c_; X(char c):c_(c){cout << c_; ~X(){ std::cout << c_; ; typedef std::auto_ptr<x> PX; PX f(char c){ return PX(new X(c) ); void g(const PX& px){ throw E(px->c_); void h() { PX pa = f( a ); try { PX pb = pa; g(f( b )); catch(const E& e){ cout << e.c_;throw; (Średnio) zaawansowane programowanie w ++ (ZPR) 38/45

Przykładowe zadania Wekt2D w1(1,1), w2(2); assert( w1 + w2 == Wekt2D(3,1) ); class Wekt2D { public: explicit Wekt2D(int dx = 0, int dy ) : dx_(dx), dy_(dy) { int getdx() { return dx_; int getdy() { return dy_; Wekt2D& operator+=(const Wekt2D& w) { Wekt2D o; o.dx_ = w.dx_ + dx_; o.dy_ = w.dy_ = dy_; return o; Wekt2D& operator+(wekt2d& w) const { Wekt2D o(*this); o += w; return o; int operator==(wekt2d w) const { return dy_ == w.dy_; private: int dx_, dy_; ; std::ostream& operator<{<(std::ostream os, Wekt2D w) { os << "(" << w.getdx() << ", " << w.getdy() << ")"; (Średnio) zaawansowane programowanie w ++ (ZPR) 39/45

Przykładowe zadania class Wekt2D { public: explicit Wekt2D(int dx = 0, int dy = 0) : dx_(dx), dy_(dy) { int getdx() const { return dx_; int getdy() const { return dy_; Wekt2D& operator+=(const Wekt2D& w) { dx_ += w.dx_; dy_ += w.dy_; return *this; Wekt2D operator+(const Wekt2D& w) const { Wekt2D o(*this); o += w; return o; bool operator==(const Wekt2D& w) const { return dx_ == w.dx_ && dy_ == w.dy_; private: int dx_, dy_; ; std::ostream& operator<<(std::ostream& os, const Wekt2D& w) { os << "(" << w.getdx() << "," << w.getdy() << ")"; return os; (Średnio) zaawansowane programowanie w ++ (ZPR) 40/45

Przykładowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; (Średnio) zaawansowane programowanie w ++ (ZPR) 41/45

Przykładowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; return addr; (Średnio) zaawansowane programowanie w ++ (ZPR) 42/45

Przykładowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; return addr; list<employee>::const_iterator it = find_if(l.begin(), l.end(), bind(&employee::name,_1) == name); (Średnio) zaawansowane programowanie w ++ (ZPR) 43/45

Przykładowe zadania Zadanie 6 (Guru of The Week, 2), niepotrzebne obiekty string FindAddr( list<employee> l, string name ) { for( list<employee>::iterator i = l.begin(); i!= l.end(); i++ ) if( *i == name ) return (*i).addr; return ""; string FindAddr( const list<employee>& l, const string& name ) { string addr; for( list<employee>::iterator i = l.begin(); i!= l.end(); ++i ) if( i->name() == name ){ addr = (*i).addr; break; return addr; list<employee>::const_iterator it = find_if(l.begin(), l.end(), bind(&employee::name,_1) == name); auto it = find_if(l.begin(), l.end(), [&](Employee& e){ return e.name == name;); (Średnio) zaawansowane programowanie w ++ (ZPR) 44/45

Przykładowe zadania Dziękuję (Średnio) zaawansowane programowanie w ++ (ZPR) 45/45