16. unora ´ 2015, Brno ´ Pˇripravil: David Prochazka
Konstruktory a destruktory ´ ´ ´ Zaklady objektoveho navrhu
Jak navrhovat pouˇzitelne´ tˇr´ıdy
ˇ Obsah pˇredna´ sky 1
Jak navrhovat pouˇzitelne´ tˇr´ıdy
2
´ Jak dosahnout automatizace
3
´ s konstruktorem Pˇr´ıklady na praci
4
Destruktor
5
Shrnut´ı
Strana 2 / 26
Jak navrhovat pouˇzitelne´ tˇr´ıdy
Strana 3 / 26
Skryt´ı a automatizace ˇ ˇ Cern a´ skˇr´ınka Mus´ıme se snaˇzit, aby byly procesy uvnitˇr tˇr´ıd co nejv´ıce ´ automatizovane´ a z pohledu uˇzivatele skryte.
Jak navrhovat pouˇzitelne´ tˇr´ıdy
Strana 4 / 26
´ e´ uˇzivatel mus´ı“ Automatizace: zˇ adn ” Pokud vytvoˇr´ıte tˇr´ıdu, mus´ı b´yt jej´ı instance pouˇzitelna´ ihned po vytvoˇren´ı.
´ Nen´ı moˇzne´ uvaˇzovat, zˇ e uˇzivatel v´ı, zˇ e mus´ı nejdˇr´ıve provest nastavit urˇcite´ atributy nebo zavolat urˇcite´ metody.
´ Jak dosahnout automatizace
ˇ Obsah pˇredna´ sky 1
Jak navrhovat pouˇzitelne´ tˇr´ıdy
2
´ Jak dosahnout automatizace
3
´ s konstruktorem Pˇr´ıklady na praci
4
Destruktor
5
Shrnut´ı
Strana 5 / 26
´ Jak dosahnout automatizace
Strana 6 / 26
Konstruktor ´ ı metoda, ktera´ se zavola´ vˇzdy automaticky po Specialn´ vytvoˇren´ı objektu. ´ Konstruktor je bud’ implicitn´ı (prazdn´ y, dosazen´y ´ pˇrekladaˇcem) nebo ruˇcneˇ definovan´y (programatorem). ´ y nenadefinujete, vola´ se automaticky Pokud tedy zˇ adn´ ´ prazdn´ y konstruktor. Konstruktor muˇ ˚ ze m´ıt parametry, ale nikdy nevrac´ı ´ zˇ adnou hodnotu. Konstruktor se vˇzdy jmenuje stejneˇ jako tˇr´ıda.
´ Jak dosahnout automatizace
Vyznam ´ konstruktoru Inicializace atributu˚ objektu, ´ ı run´ vynucen´ı zadan´ ˚ ych nezbytn´ych informac´ı, ´ ı objektu, vytvoˇren´ı dynamick´ych souˇcast´ ...
Strana 7 / 26
´ s konstruktorem Pˇr´ıklady na praci
ˇ Obsah pˇredna´ sky 1
Jak navrhovat pouˇzitelne´ tˇr´ıdy
2
´ Jak dosahnout automatizace
3
´ s konstruktorem Pˇr´ıklady na praci
4
Destruktor
5
Shrnut´ı
Strana 8 / 26
´ s konstruktorem Pˇr´ıklady na praci
Strana 9 / 26
Pˇr´ıklad bez konstruktoru Pˇr´ıklad Postava ˇ Mejme hru, kde jsou postavy. Kaˇzda´ postava ma´ vlastnosti ´ u˚ a vahu ´ ´ zdrav´ı, poˇcet zlat’ak nakladu. Kaˇzda´ nova´ postava ma´ ´ ´ u˚ a vaha ´ nakladu ´ na zaˇcatku 100 % zdrav´ı, 0 zlat’ak co nese je 0 ˇ kg. (Samozˇrejmeˇ bude m´ıt i ruzn ˚ e´ metody, ale to ted’ pominme.) Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + setZdravi(zdravi : float):void + getZdravi() : float +...
´ s konstruktorem Pˇr´ıklady na praci
´ Pˇr´ıklad bez konstruktoru: kod 1 2 3 4 5 6
class Postava { public : float m_zdravi ; float m_vahaNakladu ; int m_pocetZlataku ; };
7 8 9 10 11 12 13
int main (){ Postava * karel = new Postava ; // nezapomen na inicializaci !!! karel - > m_zdravi = 100.0; // karel - > setZdravi (100.0); // lepe ...
Strana 10 / 26
´ s konstruktorem Pˇr´ıklady na praci
Strana 11 / 26
ˇ sen´ ˇ ı s bezparametrickym Re ´ konstruktorem: ´ kod 1 2 3 4 5
class Postava { public : float m_zdravi ; foat m_vahaNakladu ; int m_pocetZlataku ;
6 7 8 9 10 11 12 13 14
Postava (){ m_zdravi = 100.0 f ; // to .0 f neni potreba m_vahaNakladu = 0.0 f ; m_pocetZlataku = 0; } }; int main (){ Postava * karel = new Postava ;
´ s konstruktorem Pˇr´ıklady na praci
Strana 12 / 26
ˇ sen´ ˇ ı s bezparametrickym Re ´ konstruktorem: model Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + Postava() + setZdravi(zdravi : float):void + getZdravi() : float +...
´ s konstruktorem Pˇr´ıklady na praci
Strana 13 / 26
Parametricky´ konstruktor ´ ı znelo: ˇ Pˇri vytvoˇren´ı postavy mus´ı b´yt vˇzdy Co kdyby zadan´ ´ u, zvolen poˇcet zlat’ak ˚ ktere´ postava dostane?
´ pˇr´ıpadeˇ pouˇzijeme parametricky´ konstruktor. V takovem ´ ı Parametrick´y konstruktor slouˇz´ı k vynucen´ı zadan´ ´ ren´ı objektu. povinnych“ ´ hodnot pˇri vytvaˇ ” Kaˇzda´ tˇr´ıda muˇ ˚ ze m´ıt v´ıce parametrick´ych konstruktoru. ˚ ˇ poctem ˇ Mus´ı se ale lisit nebo typem parametru. ˚
´ s konstruktorem Pˇr´ıklady na praci
ˇ sen´ ˇ ı s parametrickym Re ´ konst.: model Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + Postava(pocetZlataku : int) + setZdravi(zdravi : float) : void + getZdravi() : float +...
Strana 14 / 26
´ s konstruktorem Pˇr´ıklady na praci
Strana 15 / 26
ˇ sen´ ˇ ı s parametrickym ´ Re ´ konst.: kod 1 2 3 4 5
class Postava { public : float m_zdravi ; float m_vahaNakladu ; int m_pocetZlataku ;
6 7 8 9 10 11 12 13 14 15
Postava ( int pocetZlataku ){ m_zdravi = 100.0 f ; m_vahaNakladu = 0.0 f ; m_pocetZlataku = pocetZlataku ; } }; int main (){ Postava * karel = new Postava (50); // ma 50 zl . ...
´ s konstruktorem Pˇr´ıklady na praci
ˇ Cast e´ chyby 1 2 3 4 5
class Postava { public : float zdraviPostavy ; int vahaNakladu ; int pocetZlataku ;
6
Postava ( float zdravi , int zlataky ){ zdravi = zdraviPostavy ; int pocetZlataku = zlataky ; } ...
7 8 9 10 11 12
}; ´ ı! Dodrˇzujte konvence pojmenovan´ ˇ .. Tyto chyby uvid´ıte okamˇzite.
Strana 16 / 26
´ s konstruktorem Pˇr´ıklady na praci
Strana 17 / 26
Kombinace v´ıce konstruktoru: ˚ model ´ ı hry: Uˇzivatel si muˇ Znovu uprav´ıme zadan´ ˚ ze vybrat, zda ´ u˚ (0) a nebo definuje vlastn´ı pouˇzije implicitn´ı poˇcet zlat’ak mnoˇzstv´ı. Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + Postava() + Postava(pocetZlataku : int) + setZdravi(zdravi : float) : void + getZdravi() : float +...
´ s konstruktorem Pˇr´ıklady na praci
Strana 18 / 26
´ ı v kodu ´ Kombinace v´ıce konstruktoru: ˚ volan´ 1 2 3
int main (){ // nyni volame bezparametricky konstruktor Postava * karel = new Postava ;
4
// nyni opet volame bezparametricky konst . Postava * pepa = new Postava ();
5 6 7
// nyni volame parametricky konstruktor Postava * jana = new Postava (1001); ...
8 9 10 11
}
´ s konstruktorem Pˇr´ıklady na praci
Strana 19 / 26
ˇ ı pˇr´ıklady Kombinace v´ıce konstruktoru: ˚ dals´ Co lze kombinovat. . . Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + 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 +...
´ s konstruktorem Pˇr´ıklady na praci
Strana 20 / 26
ˇ ı pˇr´ıklady Kombinace v´ıce konstruktoru: ˚ dals´ Co nelze kombinovat. . . Postava + zdravi : float + pocetZlataku : int + vahaNakladu : float + 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
ˇ Obsah pˇredna´ sky 1
Jak navrhovat pouˇzitelne´ tˇr´ıdy
2
´ Jak dosahnout automatizace
3
´ s konstruktorem Pˇr´ıklady na praci
4
Destruktor
5
Shrnut´ı
Strana 21 / 26
Destruktor
Strana 22 / 26
Destruktor Je protikladem konstruktoru. ´ pˇri smazan´ ´ ı objektu Je volan (v naˇsem pˇr´ıpadeˇ obvykle delete). ´ Nesm´ı m´ıt parametry ani navratovou hodnotu. ˇ an´ ´ ı pameti ˇ a ruˇsen´ı zavisl´ ´ Slouˇz´ı obvykle pro uvolnov ych 1 objektu. ˚ Postava + zdravi : float + Postava() + ∼Postava() +... 1
´ nebude m´ıt realn ´ eˇ v´yznam. Mus´ıme si poˇckat na vazby Prozatim pro nas a sloˇzite´ objekty.
Destruktor
Strana 23 / 26
´ ıho destruktoru: implementace Pˇr´ıklad trivialn´ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
class Postava { public : Postava (){ cout << " Nazdar , prave jsem vznikl " << endl ; } ~ Postava (){ cout << " Sbohem , skoncil jsem " << endl ; } }; int main ( void ){ Postava * karel = new Postava ; // vola se kon . ... delete karel ; // vola se des . ...
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
Jak navrhovat pouˇzitelne´ tˇr´ıdy
2
´ Jak dosahnout automatizace
3
´ s konstruktorem Pˇr´ıklady na praci
4
Destruktor
5
Shrnut´ı
Strana 24 / 26
Shrnut´ı
Strana 25 / 26
Shrnut´ı Konstruktor se vola´ automaticky pˇri vzniku objektu. Slouˇz´ı k jeho inicializaci. ˇ zna´ tˇr´ıda mus´ı m´ıt konstruktor. Prakticky kaˇzda´ beˇ ´ ı parametrick´ych konstruktoru˚ davejte ´ Pˇri kombinovan´ pozor na to, aby se liˇsily poˇctem nebo typem parametru. ˚ ´ ı objektu, ale zat´ım jej Destruktor se vola´ pˇri smazan´ nepotˇrebujeme.
Shrnut´ı
Strana 26 / 26
ˇ ı Pˇr´ıklady k procvicen´ Pˇr´ıklad UIS ´ sˇ koly. System ´ eviduje Vytvoˇrte tˇr´ıdy pro informaˇcn´ı system ´ ´ studenty. Kaˇzd´y student mus´ı m´ıt zadano jmeno a rodne´ cˇ ´ıslo. ˇ ´ student muˇ Nemuˇ udaj ˚ ze existovat student bez techto ´ u. ˚ Dale ˚ ze ´ od poˇcatku ´ ˇ Tu lze ale doplnit i m´ıt zadanu adresu bydliˇste. ˇ Vytvoˇrte metodu umoˇznuj´ ˇ ıc´ı vypsan´ ´ ı vˇsech informac´ı o pozdeji. ˇ ıc´ı nastavit/zmenit ˇ studentovi na obrazovku a metodu umoˇznuj´ ˇ bydliˇste.
Pˇr´ıklad Autobazar ˇ ´ ˇ b´yt Mejme evidenci aut v bazaru. U kaˇzdeho auta by mela ´ evidovana SPZ, poˇcet najet´ych km a pˇredchoz´ı majitel. Pˇri ´ ren´ı auta muˇ ´ (nebo neznat) kteroukoliv z techto ˇ vytvaˇ ˚ zeme znat informac´ı.