¡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
2015Z
(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 "", line 1, in 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 PracownikPtr; typedef std::vector 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 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(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 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 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 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