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

Š¡czenie C++ i innych j¦zyków programowania Š¡czenie moduªów C++ z moduªami wykorzystuj¡cymi Python Powtórzenie (‘rednio) zaawansowane programowanie ...
Author: Karol Filipiak
9 downloads 3 Views 558KB Size
Š¡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