16. února 2015, Brno Připravil: David Procházka Konstruktory a destruktory Základy objektového návrhu
Jak navrhovat použitelné třídy Strana 2 / 26 Obsah přednášky 1 Jak navrhovat použitelné třídy 2 Jak dosáhnout automatizace 3 Příklady na práci s konstruktorem 4 Destruktor 5 Shrnutí
Jak navrhovat použitelné třídy Strana 3 / 26 Skrytí a automatizace Černá skříňka Musíme se snažit, aby byly procesy uvnitř tříd co nejvíce automatizované a z pohledu uživatele skryté.
Jak navrhovat použitelné třídy Strana 4 / 26 Automatizace: žádné uživatel musí Pokud vytvoříte třídu, musí být její instance použitelná ihned po vytvoření. Není možné uvažovat, že uživatel ví, že musí nejdříve provést nastavit určité atributy nebo zavolat určité metody.
Jak dosáhnout automatizace Strana 5 / 26 Obsah přednášky 1 Jak navrhovat použitelné třídy 2 Jak dosáhnout automatizace 3 Příklady na práci s konstruktorem 4 Destruktor 5 Shrnutí
Jak dosáhnout automatizace Strana 6 / 26 Konstruktor Speciální metoda, která se zavolá vždy automaticky po vytvoření objektu. Konstruktor je bud implicitní (prázdný, dosazený překladačem) nebo ručně definovaný (programátorem). Pokud tedy žádný nenadefinujete, volá se automaticky prázdný konstruktor. Konstruktor může mít parametry, ale nikdy nevrací žádnou hodnotu. Konstruktor se vždy jmenuje stejně jako třída.
Jak dosáhnout automatizace Strana 7 / 26 Význam konstruktoru Inicializace atributů objektu, vynucení zadání růných nezbytných informací, vytvoření dynamických součástí objektu,...
Příklady na práci s konstruktorem Strana 8 / 26 Obsah přednášky 1 Jak navrhovat použitelné třídy 2 Jak dosáhnout automatizace 3 Příklady na práci s konstruktorem 4 Destruktor 5 Shrnutí
Příklady na práci s konstruktorem Strana 9 / 26 Příklad bez konstruktoru Příklad Postava Mějme hru, kde jsou postavy. Každá postava má vlastnosti zdraví, počet zlat áků a váhu nákladu. Každá nová postava má na začátku 100 % zdraví, 0 zlat áků a váha nákladu co nese je 0 kg. (Samozřejmě bude mít i různé metody, ale to ted pomiňme.) Postava + zdravi : float + pocetzlataku : int + vahanakladu : float + setzdravi(zdravi : float):void + getzdravi() : float +...
Příklady na práci s konstruktorem Strana 10 / 26 Příklad bez konstruktoru: kód 1 class Postava { 2 public : 3 float m_zdravi ; 4 float m_vahanakladu ; 5 int m_pocetzlataku ; 6 }; 7 8 int main (){ 9 Postava * karel = new Postava ; 10 // nezapomen na inicializaci!!! 11 karel - > m_ zdravi = 100. 0; 12 // karel -> setzdravi (100.0); // lepe 13...
Příklady na práci s konstruktorem Strana 11 / 26 Řešení s bezparametrickým konstruktorem: kód 1 class Postava { 2 public : 3 float m_zdravi ; 4 foat m_vahanakladu ; 5 int m_pocetzlataku ; 6 7 Postava (){ 8 m_ zdravi = 100. 0 f; // to.0 f neni potreba 9 m_vahanakladu = 0.0 f; 10 m_pocetzlataku = 0; 11 } 12 }; 13 int main (){ 14 Postava * karel = new Postava ;
Příklady na práci s konstruktorem Strana 12 / 26 Řešení s bezparametrickým konstruktorem: model Postava + zdravi : float + pocetzlataku : int + vahanakladu : float + Postava() + setzdravi(zdravi : float):void + getzdravi() : float +...
Příklady na práci s konstruktorem Strana 13 / 26 Parametrický konstruktor Co kdyby zadání znělo: Při vytvoření postavy musí být vždy zvolen počet zlat áků, které postava dostane? V takovém případě použijeme parametrický konstruktor. Parametrický konstruktor slouží k vynucení zadání povinných hodnot při vytváření objektu. Každá třída může mít více parametrických konstruktorů. Musí se ale lišit počtem nebo typem parametrů.
Příklady na práci s konstruktorem Strana 14 / 26 Řešení s parametrickým konst.: model Postava + zdravi : float + pocetzlataku : int + vahanakladu : float + Postava(pocetZlataku : int) + setzdravi(zdravi : float) : void + getzdravi() : float +...
Příklady na práci s konstruktorem Strana 15 / 26 Řešení s parametrickým konst.: kód 1 class Postava { 2 public : 3 float m_zdravi ; 4 float m_vahanakladu ; 5 int m_pocetzlataku ; 6 7 Postava ( int pocetzlataku ){ 8 m_ zdravi = 100. 0 f; 9 m_vahanakladu = 0.0 f; 10 m_pocetzlataku = pocetzlataku ; 11 } 12 }; 13 int main (){ 14 Postava * karel = new Postava ( 50); // ma 50 zl. 15...
Příklady na práci s konstruktorem Strana 16 / 26 Časté chyby 1 class Postava { 2 public : 3 float zdravipostavy ; 4 int vahanakladu ; 5 int pocetzlataku ; 6 7 Postava ( float zdravi, int zlataky ){ 8 zdravi = zdravipostavy ; 9 int pocetzlataku = zlataky ; 10 } 11... 12 }; Dodržujte konvence pojmenování! Tyto chyby uvidíte okamžitě...
Příklady na práci s konstruktorem Strana 17 / 26 Kombinace více konstruktorů: model Znovu upravíme zadání hry: Uživatel si může vybrat, zda použije implicitní počet zlat áků (0) a nebo definuje vlastní množství. Postava + zdravi : float + pocetzlataku : int + vahanakladu : float + Postava() + Postava(pocetZlataku : int) + setzdravi(zdravi : float) : void + getzdravi() : float +...
Příklady na práci s konstruktorem Strana 18 / 26 Kombinace více konstruktorů: volání v kódu 1 int main (){ 2 // nyni volame bezparametricky konstruktor 3 Postava * karel = new Postava ; 4 5 // nyni opet volame bezparametricky konst. 6 Postava * pepa = new Postava (); 7 8 // nyni volame parametricky konstruktor 9 Postava * jana = new Postava (1001); 10... 11 }
Příklady na práci s konstruktorem Strana 19 / 26 Kombinace více konstruktorů: další příklady Co lze kombinovat... + zdravi : float + pocetzlataku : int + vahanakladu : float Postava + Postava() + Postava(pocetZlataku:int) + Postava(zdravi:float) + Postava(pocetZlataku:int, zdravi:float) + Postava(vahaNakladu:float, pocetzlataku:int) + Postava(vahaNakladu:float, pocetzlataku:int, zdravi:float) + setzdravi(zdravi:float) : void + getzdravi():float +...
Příklady na práci s konstruktorem Strana 20 / 26 Kombinace více konstruktorů: další příklady Co nelze kombinovat... + zdravi : float + pocetzlataku : int + vahanakladu : float Postava + Postava() + Postava(vahaNakladu:float) + Postava(zdravi:float) + Postava(zdravi:float, pocetzlataku:int) + Postava(vahaNakladu:float, pocetzlataku:int) + Postava(vahaNakladu:float, pocetzlataku:int, zdravi:float) + Postava(zdravi:float, pocetzlataku:int, vahanakladu:float) +...
Destruktor Strana 21 / 26 Obsah přednášky 1 Jak navrhovat použitelné třídy 2 Jak dosáhnout automatizace 3 Příklady na práci s konstruktorem 4 Destruktor 5 Shrnutí
Destruktor Strana 22 / 26 Destruktor Je protikladem konstruktoru. Je volán při smazání objektu (v našem případě obvykle delete). Nesmí mít parametry ani návratovou hodnotu. Slouží obvykle pro uvolňování paměti a rušení závislých objektů. 1 Postava + zdravi : float + Postava() + Postava() +... 1 Prozatim pro nás nebude mít reálně význam. Musíme si počkat na vazby a složité objekty.
Destruktor Strana 23 / 26 Příklad triviálního destruktoru: implementace 1 class Postava { 2 public : 3 Postava (){ 4 cout << " Nazdar, prave jsem vznikl " << endl ; 5 } 6 ~ Postava (){ 7 cout << " Sbohem, skoncil jsem " << endl ; 8 } 9 }; 10 int main ( void ){ 11 Postava * karel = new Postava ;// vola se kon. 12... 13 delete karel ; // vola se des. 14...
Shrnutí Strana 24 / 26 Obsah přednášky 1 Jak navrhovat použitelné třídy 2 Jak dosáhnout automatizace 3 Příklady na práci s konstruktorem 4 Destruktor 5 Shrnutí
Shrnutí Strana 25 / 26 Shrnutí Konstruktor se volá automaticky při vzniku objektu. Slouží k jeho inicializaci. Prakticky každá běžná třída musí mít konstruktor. Při kombinování parametrických konstruktorů dávejte pozor na to, aby se lišily počtem nebo typem parametrů. Destruktor se volá při smazání objektu, ale zatím jej nepotřebujeme.
Shrnutí Strana 26 / 26 Příklady k procvičení Příklad UIS Vytvořte třídy pro informační systém školy. Systém eviduje studenty. Každý student musí mít zadáno jméno a rodné číslo. Nemůže existovat student bez těchto údajů. Dále student může mít zadánu od počátku adresu bydliště. Tu lze ale doplnit i později. Vytvořte metodu umožňující vypsání všech informací o studentovi na obrazovku a metodu umožňující nastavit/změnit bydliště. Příklad Autobazar Mějme evidenci aut v bazaru. U každého auta by měla být evidována SPZ, počet najetých km a předchozí majitel. Při vytváření auta můžeme znát (nebo neznat) kteroukoliv z těchto informací.