Diskuze: pretazenie =

C++ C a C++ pretazenie =

Avatar
expoox
Redaktor
Avatar
expoox:

Ahoj, mam v triede pretazeny operator= no ten sa ale nikdy nezavola, viete mi povedat ako ho k tomu prinutim ?
Vdaka

CData & operator=(const CData & a);
.....
CData * binFile;
.....
CData * binFileArch;
.....
backUp[numOfBackUps].binFileArch = binFile;
 
Odpovědět 23. dubna 12:59
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:

Operator= nieje zavolaný pretože binFileArch aj binFile sú ukazatele, a teda na poslednom riadku len meníš na čo ukazuje. Ak chceš aby sa operator= zavolal na objekte musíš získať objekt na ktorý pointer ukazuje.

*(backUp[numOfBackUps].binFileArch) = *binFile;
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 23. dubna 13:23
'long long long' is too long for GCC
Avatar
expoox
Redaktor
Avatar
Odpovídá na B42P6
expoox:

to mi nenapadlo, diky, nechce sa mi zakladat nove vlakno tak skusim tu este, nevies nahodou ako spravit hlboku kopiu tohto? takto mi to hadze segfaulty

class CData
{
    private:
        uint32_t version;
        uint8_t block[50];

    public:
        ....
        CData & operator=(const CData & a){
            version = a.version;
            for (int i = 0; i < 50; i++)
                block[i] = a.block[i];

            return *this;
        }
};
 
Nahoru Odpovědět 23. dubna 14:12
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:

Nevidím tam žiadny problém chyba musí byť niekde inde. Skontroluj si či máš správne inicializované ukazatele, či si ich náhodou neuvoľnil, atď.

Nahoru Odpovědět 23. dubna 14:26
'long long long' is too long for GCC
Avatar
expoox
Redaktor
Avatar
expoox:

no valgrind my hlasi chybu v tomto :

==8249== Use of uninitialised value of size 8
==8249== at 0x4020E2: CData::operator=(CDa­ta const&) (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249==
==8249== Invalid write of size 4
==8249== at 0x4020E2: CData::operator=(CDa­ta const&) (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== Address 0x0 is not stack'd, malloc'd or (recently) free'd

ale nechapem co tym mysli kedze v konstruktore premennu version nulujem a zistil som ze to pada na riadku

version = a.version;
Editováno 23. dubna 14:39
 
Nahoru Odpovědět 23. dubna 14:38
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:

Chyba nieje v "funkci-i" operator=, ale v tom že jeden z objektov ktoré používaš už neexistuje. Aby si to lepšie pochopil prikladám tento kód.

class CData
{
    private:
        uint32_t version;
        uint8_t block[50];

    public:
        CData & operator=(const CData & a){
            version = a.version;
            for (int i = 0; i < 50; i++)
                block[i] = a.block[i];

            return *this;
        }
};

int main()
{
        CData a;
        CData b;
        a = b; //Toto je v poriadku, to dokazuje ze chyba nieje v operator-e
        CData *ptr = NULL;
        CData &ref = *ptr; //referencia teraz ukazuje na nieco co neexistuje
        a = ref; //Chyba
        ref = a; //Chyba
}

Takže si musíš všetko skontrolovať (kde operator= voláš, kde inicializuješ pointr-e,atď..)

Nahoru Odpovědět 23. dubna 15:01
'long long long' is too long for GCC
Avatar
expoox
Redaktor
Avatar
Odpovídá na B42P6
expoox:

dobre mam to, chyba bola v tom ze som mal dynamicke pole dynamickych poli ale to vnutorne pole nebolo naalokovane, takze si mal pravdu, dakujem

 
Nahoru Odpovědět 23. dubna 20:01
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.