Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.
Avatar
caller
Člen
Avatar
caller:14.6.2014 21:08

Zdravím, čtu jednu knihu o c++ a narazil jsem na ukázkový kód u kterého něčemu nerozumím. Chtěl bych poprosit jestli by mi někdo nějak polopatě vysvětlil proč když se v té funkce kde se přetěžuje operátor pro přiřazení a vrací se *this tak jak je možné u KOCKA micka i KOCKA fousek budou mít ukazatelé vekKocky,vahaKocky odlišné adresy? nemělo by to být tak že při fousek=micka se kromě hodnot z micky přiřadí do objektu fousek i adresy těch ukazatelů?

#include <iostream>

using namespace std;

class KOCKA
{
public:
        KOCKA();
        int ZiskejVek()         const   { return *vekKocky; }
        int ZiskejVahu()        const   { return *vahaKocky; }
        void NastavVek(int vek)         { *vekKocky = vek; }
        KOCKA & operator=(const KOCKA &);

private:
        int *vekKocky;
        int *vahaKocky;
};

KOCKA::KOCKA()
{
        vekKocky = new int;
        vahaKocky = new int;
        *vekKocky = 5;
        *vahaKocky = 9;
}

KOCKA & KOCKA::operator=(const KOCKA & ptr)
{
        if (this == &ptr)
                return *this;
        *vekKocky = ptr.ZiskejVek();
        *vahaKocky = ptr.ZiskejVahu();
        return *this;
}


int main()
{
        KOCKA micka;
        cout << "Vek Micky je: " << micka.ZiskejVek() << endl;
        cout << "Nastaveni veku Micky na 6...\n";
        micka.NastavVek(6);
        KOCKA fousek;
        cout << "Vek Fouska je: " << fousek.ZiskejVek() << endl;
        cout << "Zkopirovani Micky na Fouska...\n";
        fousek = micka;
        cout << "Vek Fouska je: " << fousek.ZiskejVek() << endl;
        return 0;
}
Editováno 14.6.2014 21:09
 
Odpovědět
14.6.2014 21:08
Avatar
caller
Člen
Avatar
caller:14.6.2014 21:17

Teda abych to upřesnil: jestli když se objekt micka přiřadí do objektu fousek tak proč nemají oba objekty stejnou adresu ukazatelů vahaKocky a vekKocky?

Editováno 14.6.2014 21:17
 
Nahoru Odpovědět
14.6.2014 21:17
Avatar
Odpovídá na caller
Luboš Běhounek Satik:14.6.2014 21:39

Protože sis operátor = (přiřazení) přetížil a tam máš jen překopírování těch hodnot, ne těch ukazatelů.

Nahoru Odpovědět
14.6.2014 21:39
https://www.facebook.com/peasantsandcastles/
Avatar
caller
Člen
Avatar
caller:14.6.2014 21:45

Aha, chápu to tedy správně že objekt fousek se předá jako parametr do té funkce s přetížením, jeho vek,váha se přiřadí do ukazatelů objektu micka vekKocky,vahaKocky a ty se pak vrátí do objektu micka takže se ty staré hodnoty jen přepíší novými?

 
Nahoru Odpovědět
14.6.2014 21:45
Avatar
Odpovídá na caller
Luboš Běhounek Satik:14.6.2014 21:55

fousek = micka;

KOCKA & KOCKA::operator=(const KOCKA & ptr) // ptr je micka, this je fousek
{
       if (this == &ptr) // pokud micka a fousek jsou totozni, jen vratime ukazatel
               return *this;
       *vekKocky = ptr.ZiskejVek(); // na misto, kam ukazuje fouskuv (mohlo by to byt napsano i s this) vekKocky se ulozi hodnota ziskana z vekKocky micky, uklada se jen ta hodnota, s ukazately se nijak nehybe, to by tu musel byt kod: vekKocky = ptr.ZiskejUkazatelNaVek(); a musel by jsi tu metodu vracejici ukazatel na vek samozrejme dopsat
       *vahaKocky = ptr.ZiskejVahu(); // to same s vahou
       return *this; // vrati se ukazatel na fouska
}
Nahoru Odpovědět
14.6.2014 21:55
https://www.facebook.com/peasantsandcastles/
Avatar
caller
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
caller:14.6.2014 21:59

Díky, přesně toto sem potřeboval.

 
Nahoru Odpovědět
14.6.2014 21:59
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na caller
Lukáš Hruda:15.6.2014 0:51

Nevím, kdo ten kód vymýšlel, ale nějak mi není jasný důvod toho, proč vekKocky a vahaKocky jsou pointery a ne obyčejné proměnné. Každopádně tam chybí destruktor pro dealokaci paměti, takže po zániku každého objektu třídy KOCKA automaticky vznikne memory leak.

 
Nahoru Odpovědět
15.6.2014 0:51
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 7 zpráv z 7.