12:00 | Temat wykladu: | |
C++: Szablony i wyjątki (by MeMeK, 17.08.06) @ wyklady.net | ||
Komentarze: http://forum.wyklady.net/index.php?75.0 | ||
12:05 | MeMeK | witam was na moim kolejnym wykladzie |
MeMeK | dzisiaj porozmawiamy sobie o | |
MeMeK | 1. szablonach | |
MeMeK | 2. wyjatkach | |
MeMeK | w c++ ofkz ;> | |
MeMeK | po zakonczeniu wykladu bedzie mozna go skomentowac | |
MeMeK | http://forum.wyklady.net/index.php?75.0 | |
MeMeK | o tutaj | |
12:06 | MeMeK | kk zaczynajmy |
MeMeK | wszyscy wiemy jaki jest c++ | |
MeMeK | mamy np taka sobie funkcje... | |
MeMeK | http://memek.piwko.pl/wyklad_sz/przyklad1.cpp | |
MeMeK | popatrzmy | |
MeMeK | Suma a i b wynosi 12 | |
12:07 | MeMeK | no fajnie |
MeMeK | dziala tak jak powinno | |
MeMeK | ale nasza funkcja dodaj (wiem ze troche trywialne) | |
MeMeK | przeciez moglaby dzialac tez dla innych zmiennych niz int | |
MeMeK | np dla double | |
12:08 | MeMeK | ale kompilator by nas ostrzegl ze kompinujemy gdybysmy do funkci przeslali double |
MeMeK | chociaz tak naprawde on i tak prz przekazywaniu argumentow do funkcji | |
MeMeK | przekazuje je jako double | |
12:09 | MeMeK | ale k |
MeMeK | zrobimy jak powinno byc | |
MeMeK | http://memek.piwko.pl/wyklad_sz/przyklad2.cpp | |
MeMeK | uzylem generatora liczb losowych | |
MeMeK | zeby nie wymyslac za duzo | |
MeMeK | i zeby bylo ciekawiej | |
MeMeK | ;> | |
12:10 | MeMeK | dla dociekliwych |
MeMeK | http://www.cplusplus.com/ref/cstdlib/srand.html | |
MeMeK | i teraz | |
MeMeK | Suma a i b wynosi 576 | |
MeMeK | Suma c i d wynosi 149 | |
MeMeK | Suma e i f wynosi 921 | |
MeMeK | Suma g i h wynosi 413 | |
MeMeK | ladnie dziala dla roznych typow | |
MeMeK | ale w koncu to sa 4 rozne funkcje | |
12:11 | MeMeK | troche nam sie nie usmiecha pisac po kilka wersci tej samej funkcji |
MeMeK | tylko z roznica typow | |
MeMeK | c++ to bardzo rygorystyczny jezyk pod wzgledem sprawdzania typow danych | |
MeMeK | ale jakze piekny ;. | |
12:12 | MeMeK | widac ze mozna zrobic taki wzorzec tej funkcji |
MeMeK | wygladalby on mniej wiecej tak: | |
MeMeK | TYP dodaj (TYP a, TYP b) | |
MeMeK | { | |
MeMeK | return a+b; | |
MeMeK | } | |
12:13 | MeMeK | wszystkie 4 funkcje w poprzednim przykladzieoperaly sie o ten wzorzecx |
MeMeK | okazuje sie ze w c++ mozna cos takiego zastosowac ;> | |
MeMeK | to bardzo by nam pomoglo ;] | |
MeMeK | ale jak ? | |
MeMeK | hmmm.. | |
12:14 | MeMeK | nasz wzorzec |
MeMeK | czyli szablon | |
MeMeK | ang template | |
MeMeK | w implementacji c++ wyglada o tak | |
MeMeK | template <typename TYP> TYP dodaj (TYP a, TYP b) | |
MeMeK | { | |
MeMeK | return a+b; | |
MeMeK | } | |
12:15 | MeMeK | to jest oczywiscie szablon naszej funkcji dodaj |
MeMeK | z poprzedniego przykladu | |
MeMeK | szablony powinno sie oddzielac od reszty kodu | |
MeMeK | wstawiajac je do plikow naglowkowych *.h | |
12:16 | MeMeK | czy tam *.hpp (zalezy od ide) |
MeMeK | wiec jak to jest zrobione | |
MeMeK | template <parametry> | |
12:17 | MeMeK | najpierw spojrzmy na przykad |
MeMeK | http://memek.piwko.pl/wyklad_sz/przyklad3.cpp | |
MeMeK | huh ;] | |
MeMeK | o polowe mniej kodu | |
MeMeK | a efekt taki sam | |
MeMeK | Suma a i b wynosi 705 | |
MeMeK | Suma c i d wynosi 256 | |
MeMeK | Suma e i f wynosi 95 | |
MeMeK | Suma g i h wynosi 593 | |
MeMeK | (nie bede dawal do osobnych plikoow w przykladach) ale wy tak robcie ;> | |
12:18 | MeMeK | wystarczy napisac jedna funkcje zamiast 4 |
MeMeK | ekstra | |
MeMeK | wszystko dzieki mechanizmowi szablonow | |
12:19 | MeMeK | jednak musimy pamietac |
MeMeK | ze nie wiemy na jakich typach bedziemy w tej funkcji dzialac | |
MeMeK | moze to byc wszystko | |
MeMeK | nawet nasza wlasna klasa | |
12:20 | MeMeK | looknijmy np tu |
MeMeK | http://memek.piwko.pl/wyklad_sz/przyklad4.cpp | |
MeMeK | mamy tam linijke | |
MeMeK | return (a >= 0 ? "dodatnia" : "ujemna"); | |
MeMeK | widac ze porownujemy nasz szablonowy parametr z zerem | |
12:21 | MeMeK | ale takie 0 doslowne jest typu int |
MeMeK | wiec kompilator moze nas ostrzec ze porownujemy rozne typy | |
MeMeK | troche to naciagane | |
12:22 | MeMeK | jak tu miec zero takiego typu jak argument |
MeMeK | wiemy ze np wywolanie takie | |
MeMeK | int() | |
MeMeK | zwraca nam 0 typu int | |
MeMeK | a double() | |
MeMeK | zwraca 0 typu double | |
MeMeK | wiec czemu nie zasosujemy typu szablonowego wewnatrz ciala funkcji | |
12:23 | MeMeK | a nbie tylko w parametrach |
MeMeK | to sie robi bardzo prosto | |
MeMeK | wystarczy wywolac nam TYP() | |
12:24 | MeMeK | w koncu TYP bedzie sie zmienail w zaleznosci od tego co zostanie wyslane jako argument |
MeMeK | po porawieniu w wyniku za wiwl sie nie zmieni | |
12:25 | MeMeK | nadal dostaniemy kilka liczb losowych |
MeMeK | Liczba a (-447) jest ujemna | |
MeMeK | Liczba b (-234) jest ujemna | |
MeMeK | Liczba c (128) jest dodatnia | |
MeMeK | Liczba d (-6) jest ujemna | |
MeMeK | teraz zero bedzie zawsze 0 odpowiedniego typu | |
MeMeK | 0f | |
MeMeK | 0u | |
MeMeK | false | |
MeMeK | itp | |
12:26 | MeMeK | a co jesli mamy funkcje ktora moze miec 2 rozne parametry |
MeMeK | hm | |
MeMeK | template <typename TYP, typename TYP2> string spr (TYP a, TYP2 b) | |
MeMeK | { | |
MeMeK | / jakies operacje na zmiennych ktore moga byc 2och roznych typow (a moga byc takie same) | |
MeMeK | } | |
MeMeK | rownie dobrze mozemy dodac kilka argumentow do szablony | |
MeMeK | szablonu* | |
12:27 | MeMeK | i spokojnie go uzywac jak zawsze |
MeMeK | ale ok | |
MeMeK | przeciez mozemy wyslac do naszej funkcji szablonowej jakas naszej klase | |
MeMeK | a ona nie zawsze umie sie porownywac czy dodawac (czyt nie ma przeladowanego opertaora) | |
12:28 | MeMeK | jak powiedziec szablonowi ze moga byc wyjatki od reguly |
MeMeK | ktora wlasnie ustanowilismy | |
12:29 | MeMeK | ano mozemy zrobic odpowiednia specjalizacje naszej funkcji szablonowej |
MeMeK | jak ma sie zachowac gdy dostani taki a taki argument | |
MeMeK | robimy to tak | |
MeMeK | template<> string spr (specjalny_typ a) | |
MeMeK | { | |
MeMeK | /inne operacje niz zwykle | |
MeMeK | } | |
MeMeK | czyli normalna funkcja dla jakiegos typu | |
12:30 | MeMeK | poprzedzona |
MeMeK | template <> | |
MeMeK | jak widac do template nie podajemy wtedy argumentow | |
MeMeK | teraz nasza funkcja sie odpowiednio zachowa w specjalnych sytuacjach | |
12:31 | MeMeK | malo tego |
MeMeK | mozemy zrobic specjalna oblsuge | |
MeMeK | dla calej grupy wyjatkow | |
MeMeK | robimy to o tak | |
MeMeK | template <typename TYP> string spr<TYP*> (TYP* wsk) | |
MeMeK | { | |
MeMeK | / juz na wzkazniku | |
MeMeK | } | |
12:32 | MeMeK | czyli mamy operacje na wskazniku |
MeMeK | a one moga sie roznic od operacji na normalnych obiektach | |
MeMeK | jak takie cos wywolac w kodzie | |
MeMeK | ano wlasnie tak | |
MeMeK | *(spr(jakis_wzkaznik)); | |
12:33 | MeMeK | prosto i przejrzyscie ;> |
MeMeK | no to teraz mamy nasza funkcje szablonowa | |
MeMeK | i bedzie wywolywana niejawnie jej odpowiednia specjalizacja | |
MeMeK | ale mozemy tez wywolac ja jawnie | |
MeMeK | o tak | |
MeMeK | spr<int>(a,b); | |
12:34 | MeMeK | do nazwy funkcji w nawiasach ostrych piszemy typ |
MeMeK | a jak to wyglada w skompilowanym pliku | |
MeMeK | czy to jakas heurystyka | |
MeMeK | niee | |
12:35 | MeMeK | kompilator juz na etapie kompilacji sprawdza dla jakich typow jest wywolywana nasza |
MeMeK | funkcja szablonowa | |
MeMeK | i tworzy odpowiednia ilosc jej specjalizacji | |
MeMeK | a nie wszystkie mozliwe jak mogloby sie wydawac | |
12:36 | MeMeK | tu kompilator zachowuje sie sprytnie ;> |
MeMeK | a co ze wzkaznikami na funkcje | |
MeMeK | jak pokazac na taka funkcje szablonowa | |
MeMeK | otoz na szablon nie da sie pokazac | |
MeMeK | bo to nie jest przeciez funkcja tak na prawde | |
MeMeK | tylko instrukcje dla kompilatora | |
12:37 | MeMeK | on dopiero wygeneruje funkcje |
MeMeK | wiec nie da sie? | |
MeMeK | oczywiscie ze sie da | |
MeMeK | tylko musimy pokazywac na konretna specjalizacje funkcji szablonowej | |
12:38 | MeMeK | ok |
MeMeK | teraz troche o szablonach klas | |
MeMeK | bo co jesli mamy np prosta klase | |
MeMeK | ktora zawiera opis i liczbe | |
12:39 | MeMeK | hmm |
MeMeK | przeciez liczba to moze byc integer | |
MeMeK | double | |
MeMeK | float | |
MeMeK | czy inne ustrojtwo | |
MeMeK | ;> | |
MeMeK | okazuje sie ze da sie stworzyc taka klase szablonowa | |
12:40 | MeMeK | http://memek.piwko.pl/wyklad_sz/przyklad6.cpp |
MeMeK | widzimy | |
MeMeK | template <typename TYP> class liczbaA | |
MeMeK | { | |
MeMeK | public: | |
MeMeK | TYP liczba; | |
MeMeK | string opis; | |
MeMeK | }; | |
MeMeK | bardzo podobne do szablonu klasy | |
12:41 | MeMeK | tfu |
MeMeK | funkcji | |
MeMeK | ;> | |
MeMeK | tez posiada slowko template | |
MeMeK | z argumentami w ostrych nawiasach | |
MeMeK | a wewnatrz klasy uzywamy odpowiedni typ slowkiem TYP | |
12:42 | MeMeK | bo taki wybralismy w nawiasach ostrych <> |
MeMeK | wiec ogolna budowa szablonow kloas | |
MeMeK | template <tyoename TYP> class klasa {/*cos*/}; | |
MeMeK | a co z dziedziczeniem takiej klasy | |
12:43 | MeMeK | jak to zrobic |
MeMeK | ano musimy dziedziczyc nie z szablonu | |
MeMeK | ale z konkretnej specalizacji | |
MeMeK | class dziecko : public liczbaA<int> {}; | |
12:44 | MeMeK | no to wiemy juz dosc duzo |
MeMeK | aa a przyjazn | |
MeMeK | czy to wyglada juz prosto | |
MeMeK | template <typename INNY> friend class klasa<INNY>; | |
MeMeK | tak sie przyjaznimy z klasa szablonowa | |
MeMeK | ktora ma argument szablony INNY | |
12:45 | MeMeK | ok a jak zrobic szablon funkcji skladowej klasy |
MeMeK | taki wyjdzie nam szablon w szablonie | |
MeMeK | template <typename TYP_Z_KLASY> | |
MeMeK | template <typename TYP_FUNKCJI> | |
MeMeK | typ_zwracany klasa<TYP_Z_KLASY>::funk (TYP_Z_FUNKCJI a) | |
MeMeK | { | |
MeMeK | / | |
MeMeK | } | |
MeMeK | troche to skompikowane | |
12:46 | MeMeK | ale da sie przyzwyczaic |
MeMeK | ;> | |
MeMeK | a co jesli mamy w szablonach klas wyjatki | |
MeMeK | trzeba zrobic specjalizacje szablonu klas | |
MeMeK | robimy to podobnie jak przy funkcjach | |
MeMeK | template <> class klasa<char> {}; | |
12:47 | MeMeK | po nazwie klasy w ostrych nawiasach dajemy typ dla jakiego specjalizujemy |
MeMeK | nasza klase | |
MeMeK | i zostala nam specjalizacja funkcji skladowej klasy | |
MeMeK | tez to jest w miare latwe | |
MeMeK | spoecjal fun | |
MeMeK | template <> klasa<char*>::funk () {} | |
12:48 | MeMeK | zadanie dla chetnych ;> |
MeMeK | napiszcie program w ktorym wykorzystacie wszystko o czym powiedzialem o szablonach | |
12:49 | MeMeK | dobra przechodzimy dalej |
MeMeK | WYJATKI | |
MeMeK | pomyslmy sobie ze mamy jakis program | |
12:50 | MeMeK | gdzies w nim wywolujemy funkcje |
MeMeK | i chcemy miec oblsuge bledow | |
MeMeK | np funkcja do obliczania odwrotnosci | |
MeMeK | dajemy jej -5 | |
MeMeK | to ona zwraca -0,2 | |
12:51 | MeMeK | czyli zwraca 1/argument |
MeMeK | ok jaki moze tu byc blad | |
MeMeK | no nie mozemy dzielic przez 0 | |
MeMeK | wiec gdybysamy dostali 0 | |
MeMeK | to trzeba o tym jakos powiedziec | |
12:52 | MeMeK | o tym bledzie |
MeMeK | ale jak | |
MeMeK | no mozna zwrocic jakis nietypowy wynikl | |
MeMeK | ale jaki tu moze byc nietypowy wynik | |
MeMeK | mamy tylko jedna wolna opcje | |
MeMeK | 0 | |
MeMeK | wiec gdy funkcja zwroci 0 znaczy ze cos poszlo nie tak | |
12:53 | MeMeK | konkretnie blad dzielenia |
MeMeK | no to mamy obsluzony blad | |
MeMeK | ok a co jesli nie ma jakiejs wolnej wartosci | |
MeMeK | tzn funkcja moze zwrocic kazda mozliwa liczbe | |
MeMeK | jak powiedziec o bledzie | |
12:54 | MeMeK | np w funkcji do obliczania tangensa |
12:55 | MeMeK | przeciez nie istnieje tangens |
MeMeK | np z 90 stopni | |
MeMeK | jak o tym powiedziec | |
MeMeK | i tu przydaje sie mechanizm wyjatkow | |
12:56 | MeMeK | w mechanizmie wyjatkow sa 3 wazne slowa |
MeMeK | try | |
MeMeK | throw | |
MeMeK | catch | |
MeMeK | wiec jak mozemy zrobic oblsuge takiego wyjatku | |
MeMeK | try | |
MeMeK | { | |
MeMeK | /niebezpieczne instrukcje | |
MeMeK | / gdzie tu rzycamy (throw) wyjatek | |
MeMeK | } | |
MeMeK | catch (arg) | |
MeMeK | { | |
MeMeK | / obsluga wyjatku | |
MeMeK | } | |
12:57 | MeMeK | jak widac niebezpieczne instrukcje (takie ktore moga sie nie powiesc) |
MeMeK | umieszczamy w bloku tr {} | |
MeMeK | try {} | |
MeMeK | i gdzies tam sa np wywolania funkcji | |
MeMeK | i inne operacje | |
MeMeK | i jesli nam cos nie pasuje | |
12:58 | MeMeK | to rzucamy wyjatek |
MeMeK | za pomoca instrukcji throw | |
MeMeK | throw obiekt; | |
MeMeK | rzucic mozna kazdym obiektem | |
MeMeK | int'em double'm | |
MeMeK | jakas nasza klasa | |
12:59 | MeMeK | moze byc tez tak |
MeMeK | throw 78f; | |
MeMeK | throw 78.0f; | |
MeMeK | moj blad | |
MeMeK | wiec taki rzucony wyjatej leci | |
MeMeK | dopiki nie napotka catch | |
MeMeK | czyli dopokie nie zostanie zlapany | |
13:00 | MeMeK | catch (typ) |
MeMeK | { | |
MeMeK | /obsluga | |
MeMeK | } | |
MeMeK | a to co za "typ" ? | |
MeMeK | ano przeciez mozemy rzucac dowolnym obiektem | |
MeMeK | wiec trzeba zlapac obiekt takiego typu jakiego rzucilismy | |
13:01 | MeMeK | bloki try-catch |
MeMeK | moga byc zagniezdzone | |
MeMeK | cos jak if else | |
13:02 | MeMeK | i jesli gdzies zostanie rzucony wyjatek |
MeMeK | to najpierw doleci do odpowiadajacego mu bloku catch | |
MeMeK | rownie dobrze moze byc jeden blok try | |
MeMeK | a kilka blokow catch | |
MeMeK | w zaleznosci od typu | |
MeMeK | rzuconego obiektu | |
13:03 | MeMeK | wtedy stosujemy tzw sito |
MeMeK | czyli np mamy mozliwe do wyrzucenia 4 typy | |
MeMeK | wyjatkow | |
MeMeK | bool | |
MeMeK | char | |
MeMeK | int | |
MeMeK | double | |
MeMeK | jak wiem | |
MeMeK | bool<char<int<double | |
13:04 | MeMeK | zajmuja w pamieci |
MeMeK | 1bit<8bitow<32bity<64bity | |
MeMeK | wiec powiedzmy ze mamy tak ustawione bloki catch | |
MeMeK | catch (double) {} | |
13:05 | MeMeK | catch (int) {} |
MeMeK | catch (char) [] | |
MeMeK | catch (bool) {} | |
MeMeK | i teraz leci sobie taki wyjatek | |
MeMeK | i najpier dolatuje do catch (double) | |
13:06 | MeMeK | a wyjatkiem jest obiekt char |
MeMeK | i coi sie dzieje | |
MeMeK | char wpadnie do catch (double) | |
MeMeK | dlatego ze jest mniejszy niz double | |
MeMeK | przeleci przez sito | |
13:07 | MeMeK | wiec moze poustawiajmy lepiej nase bloki |
MeMeK | od najdrobniejszego sita | |
MeMeK | do najgrubdzego | |
MeMeK | catch (bool) {} | |
MeMeK | catch (char) {} | |
MeMeK | catch (int) {} | |
MeMeK | catch (double) {} | |
13:08 | MeMeK | teraz jest ok |
MeMeK | co jest za duze do boola leci dalej | |
MeMeK | a co jesli bedzie wiksze od double | |
MeMeK | (np jakas nasza klasa) | |
MeMeK | wtedy mozna go zlapac tak | |
MeMeK | catch (...) | |
MeMeK | { | |
MeMeK | /instrukcje | |
MeMeK | } | |
13:09 | MeMeK | jako argument dajemy trzy kropki |
MeMeK | (...) | |
MeMeK | i tu wpadna wszystkie wyjatki | |
MeMeK | mozemy tez przekazac wyjatek dalej w bloku catch | |
MeMeK | robimy to pojedyncza instrukcja | |
MeMeK | throw; | |
13:10 | MeMeK | jest pewnien interesujacy efekt zwiazany z "lotem" wyjatku |
MeMeK | jest nim odwijanie stosu] | |
MeMeK | powiedzmy sobie ze taki wyjatek zostal rzucony gdzies w gleboko zagniezdzonym miejscu | |
13:11 | MeMeK | powiedzmy ze w czasie rekurencji |
MeMeK | i on tak bedzie "lecial" dopokie nie napotka dobrago catch | |
MeMeK | a jesli nie napotka | |
MeMeK | to bedzie dzialaj jak break i return w jednym | |
13:12 | MeMeK | bedzie konczyl wszystkie funkcje |
MeMeK | petle | |
MeMeK | bloki | |
MeMeK | obiekty lokalne (automatyczne) | |
MeMeK | beda niszczone | |
13:13 | MeMeK | ale o tym powiem za moment |
MeMeK | jak sie przed takim czyms ustrzec | |
MeMeK | musimy wiedziec jaki typ wyjatku moze rzucic nam np funkcja | |
13:14 | MeMeK | mozna to ladnie zapisac w jej deklaracji |
MeMeK | o tak | |
MeMeK | typ_zwrotu nazwa(argumenty) throw(typ_wyjatku); | |
MeMeK | tak zadeklarowana funkcja mowi nam ze MOZE rzucic wyjatek | |
MeMeK | a my musimy sie juz nim zajac | |
MeMeK | gdy np ktos bedzie uzywal naszych funkcji | |
13:15 | MeMeK | to wtedy to jest bardzo dobre rozwiazanie |
MeMeK | dobra wracajac do odwijania stosu | |
MeMeK | wiec taki nieobsluzony wyjatek | |
MeMeK | moze nam niemile zakonczyc program | |
MeMeK | jak temu zapobiedz | |
13:16 | MeMeK | ano mozna ustawic sobie specjalna funkcje |
MeMeK | unexpected() | |
MeMeK | ktora zajmie sie nieobsuzonymi wyjatkami | |
MeMeK | zazwyczaj wypisuje sie jakis alert | |
MeMeK | i konczy program | |
13:17 | MeMeK | ale nie stworzymy takiej funkcji normalnie |
MeMeK | jak kazdej innej | |
MeMeK | trzeba sie troche pogimnastykowac | |
MeMeK | ustawiamy ja za pomoca innej funkcji | |
MeMeK | dzieki set_unexpected(); | |
MeMeK | jej deklaracja wyglada tak | |
MeMeK | unexpected_handler set_unexpected(unexpected_handler pfnFunction); | |
13:18 | MeMeK | widac ze do argumentu dajemy jej wskaznik na nowa funkcje obslugi nieobsluzonych wyjatkow |
MeMeK | jednak gdybysmy nie zrobili takiej naszej funkcji | |
13:19 | MeMeK | to defaultowa wywola defaultowa funkcje terminate |
MeMeK | ktora to wywola funkcje abort | |
MeMeK | co sie zakonczy nagla smiercia naszego programu | |
MeMeK | mozemy ustawic swoja wlasna funkcje terminate | |
MeMeK | teraz was zaskocze | |
MeMeK | za pomoca | |
13:20 | MeMeK | terminate_handler set_terminate(terminate_handler pfnFunction); |
MeMeK | czyli dokladnie tak samo | |
MeMeK | podaja c jej adres nowej funkcji | |
MeMeK | wewnatrz takiej funkcji pasowalu by dac instrukcje | |
MeMeK | exit (1); | |
MeMeK | czyli ze cos w programie poszlo nie tak | |
13:21 | MeMeK | pnalezy pamietac ze podczas "lotu" jednego wyjatku nie mozna rzucac drugiego |
MeMeK | pewnie sie dziwicie jak? | |
13:22 | MeMeK | ano sa az 2 miejsca gdzie mozna rzucic wyjatek w czasie lotu innego |
MeMeK | konstruktor i destruktor | |
MeMeK | destruktor dlatego ze podczas odwijania stosu przy wychodzeniu z bloku | |
MeMeK | wywolywane sa destruktory obiektow | |
MeMeK | a konstruktor dlatego | |
MeMeK | dodam konstruktor kopiujacy | |
13:23 | MeMeK | ze podczas lapania wyjatku przez catch |
MeMeK | jest on niejawne wywolywany | |
MeMeK | ok | |
MeMeK | jest jeden powazny problem z tym odwijaniem stosu | |
MeMeK | jesli gdzie w bloku try | |
13:24 | MeMeK | alokujemy kawalek pamieci |
MeMeK | operatorem new | |
MeMeK | to po rzuceniu wyjatku | |
MeMeK | pozostale instrukcje sa pomijane | |
MeMeK | laczne | |
MeMeK | z | |
MeMeK | delete | |
MeMeK | mamy wyciek pamieci | |
MeMeK | memory leak | |
MeMeK | jak temu zaradzic | |
13:25 | MeMeK | jest sposob |
MeMeK | wiemy ze destruktory sa wywolywane | |
MeMeK | wiec mozna stworzyc sobie taki madry wskaznik | |
MeMeK | ktory w destruktorze bedzie zwalnial pamiec | |
MeMeK | delete | |
MeMeK | ale nie rozpedzajmy sie tak | |
13:26 | MeMeK | jest juz taka klasa |
MeMeK | nazywa sie auto_ptr | |
MeMeK | jak sie pewnie domyslacie jest do szablon klas | |
MeMeK | wiec moze dzialac nawet na naszych nowopowstalych obiektach | |
13:27 | MeMeK | pamietajmy ze nalezy dodac naglowek |
MeMeK | #include <memory> | |
MeMeK | uzywamy go tak | |
MeMeK | auto_ptr<nasza_klasa> wskaznik (new nasza_klasa); | |
MeMeK | i juz pozamiatane | |
13:28 | MeMeK | na koniec powiem po co korzystac z wyjatkow |
MeMeK | ano jest kilka powodo | |
MeMeK | 1. przydaja sie w bibliotekach | |
MeMeK | 2. gdy pozyczamy funkcje kolegom :> | |
MeMeK | 3. gdy nie ma innego wybory | |
13:29 | MeMeK | nalezy tez pamietac |
MeMeK | ze nie powiennismy korzystac z mechanizmu wyjatkow | |
MeMeK | na sile | |
MeMeK | wszystko dla ludzi | |
MeMeK | ;> | |
MeMeK | no to juz chyba tyle | |
MeMeK | thx wszystkim za uwage |