Avatar
caller
Člen
Avatar
caller:

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:

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):

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
:)
Avatar
caller
Člen
Avatar
caller:

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):

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
:)
Avatar
caller
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
caller:

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

 
Nahoru Odpovědět 14.6.2014 21:59
Avatar
Odpovídá na caller
Lukáš Hruda (Luckin):

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.