Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

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}}
QR Code
QR Code public:pb161_fall14_cviko09_514417 (generated for current page)