¡czenie C++ i innych j¦zyków programowania ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Powtórzenie (rednio) zaawansowane programowanie w C++ (ZPR) Wykªad 6 - ª¡czenie C++ i Pythona, powtórzenie Robert Nowak 2017L (rednio) zaawansowane programowanie w C++ (ZPR) 1/46 ¡czenie C++ i innych j¦zyków programowania ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C Powtórzenie ¡czenie C i C++ Kompilatory musz¡ by¢ zgodne (w taki sam sposób reprezentowa¢ typy wbudowane) problemy: I dekorowanie nazw dla linkera I struktury danych I funkcja main I operacje na stercie (rednio) zaawansowane programowanie w C++ (ZPR) 2/46 ¡czenie C++ i innych j¦zyków programowania ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C Powtórzenie dekorowanie nazw linker I w C nazwy nie mog¡ by¢ przeci¡»ane I w C++ mog¡ nazwa funkcji jest dekorowana przez kompilator C++ (name mengling, name decoration) extern "C" { //Zapobiega dekorowaniu nazw int funkcja(int a, int b) /* ... */ } //Zapobiega dekorowaniu nazw je»eli jest kompilowane przez C++ #ifdef __cplusplus extern "C" { #endif int funkcja( int a, int b) /* ... */ #ifdef __cplusplus } #endif (rednio) zaawansowane programowanie w C++ (ZPR) 3/46 ¡czenie C++ i innych j¦zyków programowania ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python C Powtórzenie funkcja main i struktury danych Nale»y wybiera¢ implementacj¦ main z C++, poniewa» I zapewnia ona prawidªow¡ inicjacj¦ skªadowych statycznych I zapewnia woªanie destruktorów dla skªadowych statycznych Struktury danych (tylko te, które s¡ dost¦pne w C): I typy wbudowane, POD I struktury, które nie maj¡ funkcji wirtualnych I obiekty, które zostaªy powoªane przez zwalniane przez delete I pami¦¢ zaalokowana przez przez free malloc new powinny by¢ powinna by¢ zwalniana (rednio) zaawansowane programowanie w C++ (ZPR) 4/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python I interpretowany, interaktywny j¦zyk programowania I Python Software Fundation, www.python.org I programowanie funkcyjne, obiektowe i strukturalne I dynamiczna kontrola typów I brak enkapsulacji I zarz¡dzanie pami¦ci¡ przez garbage collection I dokumentacja w kodzie ¹ródªowym I zmienna liczba argumentów funkcji i metod I zaznaczanie bloków przez wci¦cia (rednio) zaawansowane programowanie w C++ (ZPR) 5/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - hello world I uruchomienie interpretera python >>> print 'Hello world!' # comments after hash >>> quit() I skrypt I utworzenie pliku o nazwie hello.py print 'Hello world!' I uruchomienie skryptu python hello.py (rednio) zaawansowane programowanie w C++ (ZPR) 6/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python, 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 C++ (ZPR) 7/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python, obliczenia (2) % ** Funkcje wbudowane int() float() Math module (import math) modulo (5 % 2 = 1) pot¦ga (2 ** 3 = 8) konwersja (podªoga) konwersja math.e π = 3.1415... e = 2.718281... math.sqrt() pierwiastek kwadratowy math.pi 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 C++ (ZPR) 8/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - 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') # ASCII, 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 'ell' 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 C++ (ZPR) 9/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - 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 C++ (ZPR) 10/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - sªownik I len(d) - liczba obiektów w sªowniku I k in d - czy d zawiera klucz k I d[k] - zwraca warto±¢ dla klucza k, je»eli brak klucza zgªasza wyj¡tek KeyError I 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 C++ (ZPR) 11/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - 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. print a[:i] [0, 1, 2] (rednio) zaawansowane programowanie w C++ (ZPR) 12/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Programowanie strukturalne w Pythonie Nowa funkcja deniowana za pomoc¡ Przykªad: wie»e Hanoi, def a b c a b c a b c a b c animacja: http://en.wikipedia.org/wiki/File: Tower_of_Hanoi_4.gif 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 C++ (ZPR) 13/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - wyj¡tki 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def f(i): if i == 2: raise Exception('i==2') else: g(i-1) def g(i): while i > 0: i = i - 1; f(i) def h(i): try: g(i) except Exception: pass h(5) linia 15 10 11 12 06 07 08 09 01 02 04 05 06 07 08 09 01 02 03 13 14 h(5) i=5 * * * * g(5) i=5 * i=4 * f(4) i=4 * * * g(3) i=3 * i=2 * f(2) i=2 * * (rednio) zaawansowane programowanie w C++ (ZPR) 14/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Programowanie funkcyjne w Pythonie >>>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 C++ (ZPR) 15/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - moduª (plik) Moduª - plik z rozszerzeniem py zawieraj¡cy kod Pythona I wewn¡trz moduªu jego nazwa jest zmienn¡ __name__ I gdy moduª jest uruchomiony jako skrypt python module.py jego nazw¡ jest '__main__' I denicje mog¡ by¢ u»yte w innym module import name Funkcje: I dir(module-name) - zawarto±¢ moduªu I 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 C++ (ZPR) 16/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - programowanie obiektowe denicja klasy po sªowie kluczowym class class MyClass: 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 I j¦zyk upraszcza woªanie metody inicjuj¡cej obiekt, np. m=MyClass(23), wtedy m.x==23 I j¦zyk upraszcza dost¦p do atrybutu lub woªanie metody, np. m.f() to to samo co MyClass.f(m) I pierwszy atrybut metody jest wymieniony jawnie, przyj¦ªo si¦ go nazywa¢ self (rednio) zaawansowane programowanie w C++ (ZPR) 17/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - (wielo)dziedziczenie # dziedziczenie class DerivedClass(BaseClass): # definicja klasy pochodnej I je»eli atrybut (lub metoda) nie jest zdeniowana w danej klasie klasy bazowe s¡ przeszukiwane (rekursywnie) I wszystkie metody zachowuj¡ si¦ jak wirtualne w C++ I mo»na woªa¢ metody wprost BaseClass.method(self, arguments) I brak enkapsulacji (wszystkie metody i skªadowe s¡ publiczne) I isinstance(obj, class) bada, czy obj is typu class I issubclass(classA, classB) bada, zcy classA jest pochodna po classB (rednio) zaawansowane programowanie w C++ (ZPR) 18/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Python - 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 C++ (ZPR) 19/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Pakiety Pakiet - katalog zawieraj¡cy moduªy Pythona 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 C++ (ZPR) 20/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie cie»ka poszukiwa« moduªów Gdy name jest doª¡czany, poszukuje si¦ plików w katalogach: I lokalnym, zawieraj¡cym uruchomiony skrypt I innych, katalogi s¡ przechowywane w zmiennej sys.path import sys print sys.path # drukuje aktualne ±cie»ki I aby doda¢ ±cie»k¦, mo»na ustawi¢ zmienn¡ ±rodowiskow¡ PYTHONPATH (rednio) zaawansowane programowanie w C++ (ZPR) 21/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Standardowe pakiety Pythona - dostarczane wraz z interpreterem dokumentacja: http://docs.python.org/library/ string re struct diib 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 leinput stat statvfs lecmp temple glob fnmatch linecache shutil dircache macpath pickle cPickle copy_reg shelve marshal anydbm whichdb dbm gdbm dbhash bsddb dumbdbm sqlite3 zlib gzip bz2 ziple tarle csv CongParser robotparser netrc xdrlib plistlib hashlib hmac md5 sha os io time argparse optparse getopt logging logging.cong 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 multile 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 CGIHTTPServer cookielib Cookie xmlrpclib SimpleXMLRPCServer DocXMLRPCServer 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 Commands Prolers hotshot timeit trace sys syscong future_builtins warnings contextlib abc atexit traceback gc inspect site user fpectl distutils code codeop rexec Bastion imp imputil zipimport pkgutil modulender runpy parser ast symtable symbol token keyword tokenize tabnanny pyclbr py_compile compileall dis pickletools i wiele innych (rednio) zaawansowane programowanie w C++ (ZPR) 22/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie automatyczna instalacja pakietów kilka tysi¦cy pakietów dost¦pnych w repozytorium Python Package Index. pypi.python.org Dost¦pne s¡ narz¦dzia do automatycznego instalowania pakietów przechowywanych w tym repozytorium I zainstalowa¢ setuptools dla odpowiedniej wersji interpretera http://pypi.python.org/pypi/setuptools#downloads I run the Python egg: sh setuptools-version.egg Nast¦pnie: I pip install package_name I wersja pakietu jest wybierana automatycznie (najcz¦±ciej najnowsza) (rednio) zaawansowane programowanie w C++ (ZPR) 23/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie ¡czenie C++ i Pythona (rednio) zaawansowane programowanie w C++ (ZPR) 24/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Potrzeba u»ycia ró»nych j¦zyków w aplikacjach (patrz wykªad 1) System komputerowy zawsze: I ma ograniczenia czasowe, wi¦c tworzenie caªo±ci powinno by¢ mo»liwie szybkie I posiada pewne elementy, które s¡ w¡skim gardªem - powinny by¢ zaimplementowane wydajnie (20% kodu) System komputerowy cz¦sto: I posiada pewne elementy, których autor nie chce udost¦pnia¢ (kod ukryty przed u»ytkownikiem) I posiada pewne fragmenty, które powinny by¢ dost¦pne dla u»ytkownika (aby dostosowa¢ aplikacj¦ do indywidualnych potrzeb, np. konguracja) (rednio) zaawansowane programowanie w C++ (ZPR) 25/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie ¡czenie C++ i Pythona I powody rozszerzania Pythona w C++ I kod wykonywany jest szybciej I wykorzystanie istniej¡cego kodu I kod jest ukryty przed u»ytkownikiem I powody osadzania Pythona w C++ I brak potrzeby kompilacji I wykorzystanie bibliotek Pythona I kod dost¦pny dla u»ytkownika Interfejsy: I Python C API I Boost Python (rednio) zaawansowane programowanie w C++ (ZPR) 26/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Przykªady Rozszerzanie Pythona w C++: I utworzenie biblioteki dzielonej zawieraj¡cej funkcje w C++ I import biblioteki do Pythona i wykonanie Przykªad: hello world Osadzanie Pythona w C++ (Boost Python): Przykªad: embedding (rednio) zaawansowane programowanie w C++ (ZPR) 27/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Zadanie dodatkowe (dodatkowe 10 pkt) Zadanie nieobowi¡zkowe, omówione cz¦±ciowo na wykªadzie 1. Napisa¢ przykªadow¡, prost¡ aplikacj¦, która wykorzystuje Python/C++/JavaScript. Aplikacja powinna kompilowa¢ si¦ i dziaªa¢ na ró»nych systemach operacyjnych (np. Linux, Windows), wykorzystywa¢ przegl¡dark¦ jako graczny interfejs u»ytkownika. (rednio) zaawansowane programowanie w C++ (ZPR) 28/46 ¡czenie C++ i innych j¦zyków programowania Python ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python ¡czenie C++ i Pythona Powtórzenie Dodatkowa lektura (http://staff.elka.pw.edu.pl/~rnowak2/rnbib.html): I R. Nowak, Biblioteka Boost.Python. ¡czenie C++ i Pythona, Software Developer's Journal, 2011. I R. Nowak, Wydajne i elastyczne programy. ¡czenie C++ i Pythona przy pomocy Boost.Python, Programista, 2012. I R. Nowak, Komunikacja z serwerem w aplikacjach ex, Programista, no. 7, pp. 52 54, 2012. I R. Nowak, Aplikacje internetowe wykorzystuj¡ce python. biblioteki up, web2py, django, Programista, no. 13, pp. 66 69, 2013. (rednio) zaawansowane programowanie w C++ (ZPR) 29/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Powtórzenie (rednio) zaawansowane programowanie w C++ (ZPR) 30/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Wzorce projektowe I Wzorce kreacyjne (tworzenie obiektów) I fabryka obiektów I fabryka abstrakcyjna I prototyp I singleton I wzorce strukturalne (budowa obiektów) I adapter I fasada I proxy I kompozyt I dekorator I wzorce czynno±ciowe (wspóªpraca pomi¦dzy obiektami) I polecenie, komenda I wizytator I wielometoda I obserwator I iterator (rednio) zaawansowane programowanie w C++ (ZPR) 31/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Powtórzenie i uzupeªnienie wiadomo±ci o C++ I staªo±¢, 'const', 'mutable' I polimorzm, funkcje wirtualne, dziedziczenie wielobazowe I dynamiczna informacja o typie I ró»ne strategie obsªugi bª¦dów, mechanizm wyj¡tków I sprytne wska¹niki: I std::unique_ptr, std::auto_ptr (wycofywany) I std::shared_ptr, boost::shared_ptr I std::weak_ptr, boost::weak_ptr I boost::scoped_ptr, boost::scoped_array I boost::intrusive_ptr I referencja do r-warto±ci w C++11 (r-value reference) (rednio) zaawansowane programowanie w C++ (ZPR) 32/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Przykªadowe zadania (rednio) zaawansowane programowanie w C++ (ZPR) 33/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Zad1 - zaproponuj implementacj¦ 'readFromStream' wczytuje ona kolekcj¦ pracowników ze strumienia (hierarchia taka jak na rysunku). Deklaracje s¡ zaproponowane poni»ej. enum PracownikTyp { SEZNONOWY, SPECJALISTA, KIEROWNIK}; typedef boost::shared_ptr<Pracownik> PracownikPtr; typedef std::vector<PracownikPtr> Pracownicy; Pracownicy readFromStream(std::istream& iys); (rednio) zaawansowane programowanie w C++ (ZPR) 34/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie typedef boost::shared_ptr<Pracownik> PracownikPtr; class UnknownTypeException : public std::exception { }; class PracownikFactory { public: typedef PracownikPtr (*PracownikCreateFun)(); static PracownikFactory& getInstance() { static PracownikFactory instance; return instance; } void regist(int t, PracownikCreateFun fun) { creators_.insert( std::pair<int,PracownikCreateFun>(t,fun) ); } PracownikPtr create(std::istream& is) { int typ; is >> typ; Creators::const_iterator it = creators_.find(typ); if(it != creators_.end() ) return it->second(); else throw UnknownTypeException(); } private: typedef std::map<int,PracownikCreateFun> Creators; Creators creators_; (rednio) zaawansowane programowanie w C++ (ZPR) }; 35/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 36/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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* Child; typedef std::vector<Child> Children; std::string name_; Children ch_; public: Dir(const std::string& n) : name_(n) {} std::string getName() const { return name_; } int getSize() const { int size = 0; for(Children::const_iterator i=ch_.begin(); i!=ch_.end();++i) size += (*i)->getSize(); return size; } void add(Child el) { ch_.push_back(el); } ~Dir() { for(Children::iterator i=ch_.begin(); i!=ch_.end();++i) delete *i; } (rednio) zaawansowane programowanie w C++ (ZPR) }; 37/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 38/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 denicja typu PX zosta- nie zmieniona na nast¦puj¡c¡: typedef X* PX;, zostanie klasy X wywoªany to ile razy destruktor 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 C++ (ZPR) 39/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) } 40/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) } 41/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 42/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 43/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 44/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie 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 C++ (ZPR) 45/46 ¡czenie C++ i innych j¦zyków programowania Powtórzenie ¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Przykªadowe zadania Powtórzenie Dzi¦kuj¦ (rednio) zaawansowane programowanie w C++ (ZPR) 46/46