NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 6 - Bojovník do arény - Zapouzdření

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:2.1.2018 21:07

Dobrý, v prvom rade musím pochváliť výbornú sériu aj článok, ale okrem toho by som rád dve veci :-)

1 - V časti Metody - A jak víme z "předchozí lekce":{PREVI­OUS_URL}, …

2 - K tej istej časti by som mal aj otázku. Ak som ten zápis ako tomu hovoríte inicializácie parametrov (hlavne referencie na kocku) pochopil správne, tak ten zápis

konstruktor(T1 p1, T2 p2, …) : p1(p1), p2(p2), …

nie sú delegované konštruktory, ale vlastne to je ekvivalent zápisu

this->p1 = p1; this->p2 = p2; …,

ktorý "len" prebehne pred zavolaním tela konštruktoru inicializovaného objektu?

Za odpoveď vopred ďakujem.

Editováno 2.1.2018 21:09
Odpovědět
2.1.2018 21:07
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Patrik Valkovič:2.1.2018 21:23

Ahoj,
díky opraveno.
V principu ano, a je to právě z důvodu referencí. Když bude atribut reference, tak volání this->p1 nepůjde. Reference totiž musí být inicializovaná ještě před spuštěním konstruktoru. To obstarává právě tento zápis (vlastně se jedná o inicializaci proměnných). Podobně pokud by byl atributem třída, která nemá výchozí konstruktor (tedy bezparametrický), muselo by se postupovat tímto způsobem, protože atribut musí být nějak inicializován ještě před vykonáváním konstruktoru.

Odpovědět
2.1.2018 21:23
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Martin Petrovaj:2.1.2018 22:09

Ďakujem za dovysvetlenie. Ešte by som sa ale pre úplné pochopenie chcel spýtať, čo presne sa vlastne deje, keď napr. v našom prípade inicializujeme týmto spôsobom referenciu na objekt typu Kocka. Hlavne mi nejde do hlavy ten zápis - kocka(kocka) (alebo radšej všeobecne atribut(parame­ter)), jednak sa mi zdá zvláštne inicializovať objekt volaním niečoho (predpokladám že nejakého špeciálneho konštruktora? Toť prvá otázka) na kvázi inštancii.

Ak sa takto volá konštruktor, tak to je nejaký automagicky vygenerovaný alebo zvláštny druh? Som z toho trochu mimo preto, lebo mi Visual Studio ponúka (a vlastne aj využívame) overloady s parametrami, ktoré som explicitne nikde nezadefinoval.

Alebo som úplne mimo a zbytočne som sám seba zmiatol a v skutočnosti je to len nejaká osobitná syntax pre poslanie referencie z parametra atribútu inicializovaného objektu? Prepáčte, asi robím z papierovej vlaštovky balistickú strelu, ale snažím sa čo najlepšie a najdetailnejšie pochopiť spôsoby cpp aby som vedel kedy, čo a ako použiť, ale čím ďalej nad tým rozmýšľam, tým viac ma skúsenosti z vyšších jazykov mätú ;-( :-)

No a aby som položil aj jednoduchú otázku dokonca priamo k tomuto článku - cpp asi nemá nič na spôsob vlastností (properties), ako ich poznáme napr. v C#, že? Všetko cez get/setPremenna()

Odpovědět
2.1.2018 22:09
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Patrik Valkovič:2.1.2018 22:44

Ahoj, C++ properties jako C# nemá (jako getter a setter). Musíš explicitně použít getAtribut a setAtribut.
Co se to toho konstruktoru týče. Konstruktor je prostě metoda, která se zavolá při vytvoření. Problém je, že před tím, než se volá metoda, musíš mít nějakou hodnotu atributů. Představ si tento příklad:

class A{
private:
        int atribut;
public:
        A(){
                cout << this->atribut << endl;
        }
}

Jakou hodnotu program vypíše? Nejspíše nedefinovanou (podle toho co zrovna bylo v paměti). To je ale jen důsledek toho, že typ int nemusí být inicializovaný. Co když ale bude atribut typu třídy.

class A{
public:
        int atribut;
}
class B{
public:
        A instance;
        A(){
                cout << this->instance->atribut << endl;
        }
}

Program pořád půjde spustit, protože se použije výchozí hodnota typu int (nedefinováno) a na třídě A se zavolá bezparametrický konstruktor. Co když ale bude existovat pouze parametrický konstruktor?

class A{
public:
        int atribut;
        A(int val){
                this->atribut = val;
        }
}

Jak bys nyní zavolal tento konstruktor ve třídě B?

class B{
public:
        A instance;
        A(){
                this->instance = new A(5); //není ukazatel
                this->instance = A(5); //volá přiřazovací operátor, ne konstruktor
                this->instance(5); //volá () operátor, ne konstruktor
        }
}

Problém je právě v tom, že instance musí být jednoznačně vytvořena (inicializována) ještě před tím, než se konstruktor zavolá. Potřebujeme tedy zavolat konstruktory atributů. A k tomu je právě ona syntaxe.

class B{
public:
        A instance;
        A() :instance(5) { //vol8n9 konstruktor atributu instance
                cout << this->instance->atribut << endl; //vypise 5
        }
}

Stejný případ je to v případě referencí.
Pokud inicializaci atributu nepoužiješ, použije se by default bezparametrický konstruktor (druhý kód). V případě int to znamená náhodnou hodnotu, nicméně můžeš takto inicializovat i int.

class A{
private:
        int atribut;
public:
        A(): atribut(5) {
                cout << this->atribut << endl; //vypíše 5
        }
}
Odpovědět
2.1.2018 22:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Neaktivní uživatel:9.11.2019 13:32

Ahoj.
V článku by se hodil odkaz na initializer list, v místě kde je použit.
(jaký je rozdíl mezi initializer listem a přiřazením, proč se používá)

Odpovědět
9.11.2019 13:32
Neaktivní uživatelský účet
Avatar
Jiří Izer
Člen
Avatar
Jiří Izer:8. dubna 21:22

Ahoj, vzhledem k tomu, že u této kapitoly nelze potvrdit prostudování, tak až do konce kurzu budou všechny další části neodfajfkované 😞 . Řeší to někdo z IT Network? Díky

 
Odpovědět
8. dubna 21:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.