Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
— |
public:pb161_fall14_cviko09_514417 [2018/02/24 19:10] (aktuální) |
||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Cvičení 09 ====== | ||
+ | ===== Úvod do cvičení ===== | ||
+ | Na tomto cvičení budete pracovať s operátormi, vyskúšate si, ako ich preťažiť a tým prispôsobiť vašim potrebám. Zoznámite sa s operátorom friend a naučíte sa vytvoriť kópiu objektu, ktorého presný typ nebude v dobe prekladu známy. | ||
+ | Na toto cvičenie využijete mierne zjednodušené triedy z druhej domácej úlohy, ktoré si môžete stiahnuť{{:internal:geometry.zip|tu}}. | ||
+ | Okrem jednoduchých tried //Circle// a //Rectangle// pribudne ešte jeden potomok triedy //Geometry2D// a to trieda //ObjectSet//. Tá predstavuje množinu jednoduchých objektov. Tie budú uložené v privátnom atribúte //object// typu //vector<Geometry2D*>// Tie množiny bude možné pomocou operátorou zjednotiť, získať ich prienik, či odobrať z nich prvok. | ||
+ | ===== První úkol ===== | ||
+ | Operátor + | ||
+ | |||
+ | ==== Zadání úkolu ==== | ||
+ | |||
+ | * Implementujte operátor tak, aby bolo možné sčítať dve množiny (teda vytvoriť ich zjednotenie) | ||
+ | * Zároveň bude možné k množine pričítať jednoduchý objekt (//Circle// alebo //Rectangle//). To znamená pridanie prvku do množiny. | ||
+ | * Nezabudnite, že operátor by mal byť komutatívny. Fungovať teda musí: Množina + Množina, Množina + Objekt a Objekt + Množina. | ||
+ | * Dávajte pozor, aby operator nemenil vnútorný stav tried. To znamená, aby príkaz //set3 = set1 + set2// nezmenil množiny 1 a 2, ale iba vyslednú množinu 3 | ||
+ | |||
+ | ===== Druhý úkol ===== | ||
+ | Kopírovací konštruktor, operátor priradenia a klonovanie objektov | ||
+ | ==== Zadání úkolu ==== | ||
+ | |||
+ | Naším cieľom je dosiahnuť, aby sa pri manipulácii s našimi objektami vytvárala hlboká a nie plytká kópia. | ||
+ | Nasledujúci kus kódu zmenil farbu kruhu v druhej množine, ale logicky by nemal ovplyvniť množinu prvú. Takže nakoniec by mala prvá množina obsahovať kruh modrý a druhá zelený. Aby to takto fungovalo, je nutné predefinovať operátor = | ||
+ | <code c> | ||
+ | ObjectSet set1; | ||
+ | ObjectSet set2; | ||
+ | Circle c1; | ||
+ | c1.setColor(BLUE); | ||
+ | set1 = set1 + c1; | ||
+ | set2 = set1; | ||
+ | set2.object[0].setColor(GREEN); | ||
+ | </code> | ||
+ | <note important>Nezabudnite, že operátor = musí byť implementovaný ako metóda triedy.</note> | ||
+ | Naviac je vhodné napísať si aj vlastný kopírovací konštruktor. S ním bude možné spraviť hlbokú kópiu aj v ďalších prípadoch, napríklad keď objekt inicializuje iný objekt. | ||
+ | <code c> | ||
+ | ObjectSet* set2= new ObjectSet(set1); | ||
+ | </code> | ||
+ | Vytvoriť hlbokú kópiu triedy ObjectSet nie je úplne triviálne, pretože typ jednotlivých prvkov množiny nie je dopredu známy. | ||
+ | Jeden spôsob je napísať si metódu clone, ktorá umožní skopírovať aj objekt neznámeho typu. Viac o klonovaní objektov sa dozviete napríklad tu. | ||
+ | ===== Třetí úkol ===== | ||
+ | Operátor - | ||
+ | |||
+ | ==== Zadání úkolu ==== | ||
+ | |||
+ | * Napíšte operátor - tak, aby bolo možné odčítať od seba dve množíny a zároveň odćítať z množiny konkrétny prvok. | ||
+ | * Dávajte pozor, //find// na vectore nebude fungovať. Do vectoru sa totiž ukladajú ukazatele a jednotlivé adresy sa pri priraďovaní vplyvom klonovania menia. | ||
+ | |||
+ | ===== Čtvrtý úkol ===== | ||
+ | |||
+ | operátor & | ||
+ | ==== Zadání úkolu ==== | ||
+ | |||
+ | * Tento operátor bude predstavovať prienik množín. | ||
+ | |||
+ | ===== Vzorové řešení ===== | ||
+ | |||
+ | {{:internal:cv9_riesenie.zip|riešenie}} |