| 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 |