Rozdíly

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

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
public:hw06 [2010/12/23 22:51]
xvlach4 [Požadavky]
public:hw06 [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
 +====== Bonusový domácí úkol č. 6: Záznam činnosti konstruktorů a destruktorů ======
  
 +Úkol je nepovinný a má změněné bodové hodnocení (max. 4 body funkčnost, max. 6 bodů počet odevzdání,​ bez bonusů). Úkol se odevzdává pouze ''​naostro''​.
 +
 +  * Úkol zadán: **6. 12. 2010**
 +  * Deadline odevzdání:​ **3. 1. 2011**
 +
 +Doplnění zadání (zobrazeno __podtrženě__):​
 +  * Drobné změny ve formátu výpisu
 +  * 10.12. Objasněn formát výstupu
 +  * 11.12. Přidána jedna podmínka, odstraňující nejednoznačnost hierarchie
 +  * 13.12. Formát výpisu vrácen do stavu před mylnou úpravou
 +
 +==== Představení úkolu ====
 +Tato jednoduchá bonusová úloha by měla přispět k lepšímu pochopení toho, jak jsou objekty v paměti vytvářeny a rušeny. Úkolem je vytvořit hierarchii pěti (5) tříd, jejichž objekty dávají prostřednictvím ''​cout''​ (výpisem do něj) vědět, v jakém pořadí a jakým způsobem byly zkonstruovány,​ a v jakém pořadí byly (potom) zrušeny.
 +
 +==== Zadání ====
 +Stáhněte si [[.ConstructionLoggingExample|zdrojový kód ukázkového programu]], zkuste si jej zkompilovat a výsledný program spustit. Protože hlavním účelem programu je ukázat, co se děje s proměnnými,​ respektive pod nimi ležícími objekty za běhu programů, bude rozumné nahlédnout do zdrojového kódu a zkusit si najít odkud asi jaký výpis pochází. Zatímco v ukázkovém programu si prohlédnete životní dráhu objektů dvou jednoduchých tříd, vaším úkolem je napsat podobný kód pro hierarchii 5 tříd podle následujících bodů.
 +
 +==== Požadavky ====
 +  * Vytvořte hierarchii tříd pojmenovaných C1, C2, C3, C4, C5 (a žádných jiných), v níž budou platit tyto vztahy:
 +    * C1 má právě dva přímé potomky.
 +    * C1 je přímým nebo nepřímým předkem tříd C2, C3, C4, C5.
 +    * C4 nedědí z C2 ani z C3. __Ani C3 nedědí z C4.__
 +    * Příkaz ''​C2 instance_C2;''​ vyvolá spuštění konstruktorů právě dvou tříd.
 +    * Příkaz ''​C3 instance_C3;''​ nebude možné přeložit. (Samotná třída musí být přeložitelná.)
 +    * Příkaz ''​C4 instance_C4;''​ nebude možné přeložit.
 +    * Příkaz ''​C5 instance_C5;''​ vyvolá spuštění konstruktorů všech pěti tříd.
 +   
 +  * Ke každé z tříd, kterou je možné zkonstruovat (podle vztahů výše) implementujte 3 konstruktory - bezparametrický,​ s parametrem typu std::string a kopírovací a destruktor. Všechny musejí být veřejně přístupné (public). U ostatních tříd chceme pouze bezparametrický konstruktor a destruktor, oba opět veřejně přístupné.
 +    * V kopírovacím konstruktoru si zkopírujte řetězcový atribut parametru a před uložením k němu předřetězte ''<​nowiki>"​copied "</​nowiki>''​.
 +    * Každý konstruktor i destruktor musí vypsat název své třídy a svoji identifikaci na standardní výstup, podobným způsobem jako je tomu v ukázkovém programu.
 +      * __Přesný formát__ (pro umožnění automatizovaného vyhodnocení),​ ''​+''​ zde značí zřetězení (tak jak jej můžete vložit na výstup): ​
 +        - Bezparametrický konstruktor:​ ''<​nowiki>"​Implicit constructor of " + NAZEV_TRIDY + lineEnd</​nowiki>''​
 +        - Parametrický:​ ''<​nowiki>"​Constructor of " + NAZEV_TRIDY + " with parameter \""​ + PARAMETR "​\""​ + lineEnd</​nowiki>''​
 +        - Kopírovací:​ ''<​nowiki>"​Copy constructor of " + NAZEV_TRIDY + " with parameter \""​ + PARAMETR "​\""​ + lineEnd</​nowiki>''​
 +        - Destruktor: ''<​nowiki>"​Destructor of  " + NAZEV_TRIDY + " object labeled as \""​ + PARAMETR_Z_KONSTRUKTORU + "​\""​ + lineEnd</​nowiki>''​
 +          - Tedy výpis bude například takovýto ​ ''<​nowiki>​Copy constructor of C4 with parameter "​copied My little instance"</​nowiki>''​
 +  * V konstruktorech potomků nezkoušejte inicializovat zděděný atribut přímo, namísto toho zavolejte parametrický konstruktor toho předka, který atribut deklaroval. U bezparametrických konstruktorů volejte buď bezparametrické konstruktory přímých předků (to jsou ty ze kterých explicitně dědíte), nebo nic (k jejich vyvolání dojde automaticky).
 +  * Třídám C1...C5 smíte přidat libovolné metody, pokud to jde, nastavte jim skrytou přístupnost (private nebo protected).
 +  * Pokud použijete vícenásobnou dědičnost,​ použijte zároveň virtuální dědění, tak, aby nedocházelo k duplikaci atributů. Zároveň třídy, ze kterých dědíte uveďte ve vzestupném pořadí podle jejich názvů (např. ''​class CX: public C1, public C4''​),​ pro snazší porovnatelnost výpisů.
 +  * Svůj kód rozdělte do dvou souborů, ''​construct_full.h'',​ kam umístíte deklarace tříd a definiční ''​construct_full.cpp'',​ kam zapíšete těla metod.
 +
 +==== Poznámky ====
 +  * I v případě, že nechcete úlohu vypracovávat,​ zkuste se podívat, co dělá ukázkový program.
 +  * Všimněte si, v jakém pořadí se automaticky vytvářené proměnné dealokují a zamyslete se nad souvislostí s pořadím jejich alokace a typem struktury, která se pro jejich uložení použije v počítači.
 +  * Pro otestování svého řešení si vytvořte vhodnou funkci ''​main''​ do samostatného souboru (v ukázkovém řešení bude nazván ''​construct_full_main.cpp''​),​ můžete použít rozšířenou/​upravenou verzi main z ukázkového kódu. Tento soubor nemusíte odevzdávat.
 +    * //Tip//: Pokud chcete nějakým způsobem oddělit výpis destruktorů pro jednotlivé objekty, zkuste použít dynamickou alokaci/​dealokaci.
 +  * Ať to šlape! :)
 +**Autor:** Úlohu připravil [[https://​is.muni.cz/​auth/​osoba/​325278|Martin Vlach]], v případě potřeby mne kontaktujte na <​huge@mail.muni.cz>​.
QR Code
QR Code public:hw06 (generated for current page)