IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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: Potrebujem pomoct s kodom :D

Aktivity
Avatar
filL
Člen
Avatar
filL:16.7.2018 20:39

Zdravim ucim sa v c++ a narazil som na mensi zadrhel :D. Celkom som nepochopil ako je mozne ze v pretazenom operatore += a + je vytvoreny objekt triedy Retazec

unsigned short int celkovaDlzkaRetazca = dlzkaRetazca + pravaStrana.dlzkaRetazca;
Retazec docastny(celkovaDlzkaRetazca);

tak ze mu je predany parameter typu unsigned short. Retazec predsa nema ziadny verejny konstruktor ktory prijma ako parameter typ unsigned short. Napadlo ma ze sa vola sukromny konstruktor ale to neni mozne kedze je sukromny :D. Za kazdu radu som vdacny :D PARDON ZA PRAVOPIS

#include <iostream>

class Retazec
{
public:
        //Constructors
        Retazec();
        Retazec(const char*const);
        Retazec(const Retazec&);
        ~Retazec();

        //Pretazene operatory
        char & operator[](int pozicia);
        char operator[](int pozicia) const;
        Retazec operator+(const Retazec&);
        void operator+=(const Retazec&);
        Retazec & operator=(const Retazec&);

        //Pristupove Funkcie
        int ZiskajDlzkuRetazca() const { return dlzkaRetazca; }
        const char * ZiskajRetazec() const { return retazec; }

        //Staticke funkcie
        static unsigned short int ZiskajPocetKonstruktorov() { return pocetKonstruktorov; }

private:
        static unsigned short int pocetKonstruktorov;   // Staticka premenna

        Retazec(int);

        char * retazec;
        unsigned short int dlzkaRetazca;
};

unsigned short int Retazec::pocetKonstruktorov = 0;

// Vychodzi konstruktor vytvori retazec o pocte 0 znakov (0 bajtov)
Retazec::Retazec()
{
        retazec = new char[1];
        retazec[0] = '\0';
        dlzkaRetazca = 0;

        pocetKonstruktorov++;
}

// Sukromny konstruktor pouzivany metodamy triedy k vytvoreniu noveho retazca o pozadovanej velkosti
Retazec::Retazec(int delka)
{
        retazec = new char[delka + 1];

        for (int i = 0; i <= delka; i++)
        {
                retazec[i] = '\0';
        }

        dlzkaRetazca = delka;

        pocetKonstruktorov++;
}


// premieňa pole znakov na retazec
Retazec::Retazec(const char * const cRetazec)
{
        dlzkaRetazca = strlen(cRetazec);
        retazec = new char[dlzkaRetazca + 1];
        for (int i = 0; i <= dlzkaRetazca; i++)
        {
                retazec[1] = cRetazec[i];
        }

        retazec[dlzkaRetazca] = '\0';

        pocetKonstruktorov++;
}

//Kopirovaci konstruktor
Retazec::Retazec(const Retazec & cRetazec)
{
        retazec = new char[cRetazec.dlzkaRetazca + 1];
        for (int i = 0; i <= cRetazec.dlzkaRetazca; i++)
        {
                retazec[i] = cRetazec[i];
        }

        retazec[cRetazec.dlzkaRetazca] = '\0';

        pocetKonstruktorov++;
}

Retazec::~Retazec()
{
        delete[] retazec;
        dlzkaRetazca = 0;
}

char & Retazec::operator[](int pozicia)
{
        if (pozicia > dlzkaRetazca)
        {
                return retazec[dlzkaRetazca - 1];
        }
        else
        {
                return retazec[pozicia];
        }
}

char Retazec::operator[] (int pozicia) const
{
        if (pozicia > dlzkaRetazca)
        {
                return retazec[dlzkaRetazca - 1];
        }
        else
        {
                return retazec[pozicia];
        }
}


Retazec & Retazec::operator=(const Retazec & pravaStrana) // retazec1 = retazec2; retazec1.operator=(retazec2)
{
        if (this == &pravaStrana)
        {
                return *this;
        }

        delete[] retazec;

        retazec = new char[pravaStrana.dlzkaRetazca];

        for (int i = 0; i <= pravaStrana.dlzkaRetazca; i++)
        {
                retazec[i] = pravaStrana.retazec[i];
        }

        retazec[pravaStrana.dlzkaRetazca] = '\0';

        return *this;
}

void Retazec::operator+=(const Retazec & pravaStrana) // retazec1 += retazec2; retazec1.operator+=(retazec2);
{
        unsigned short int celkovaDlzkaRetazca = dlzkaRetazca + pravaStrana.dlzkaRetazca;
        Retazec docastny(celkovaDlzkaRetazca);

        int i, j;

        for (i = 0; i < dlzkaRetazca; i++)
        {
                docastny[i] = retazec[i];
        }
        for (j = 0; j < pravaStrana.dlzkaRetazca; i++, j++)
        {
                docastny[i] = pravaStrana[j];
        }
        docastny[celkovaDlzkaRetazca] = '\n';

        delete[] retazec;
        *this = docastny;
}

Retazec Retazec::operator+(const Retazec & pravaStrana) // retazec1 += retazec2; retazec1.operator+=(retazec2);
{
        unsigned short int celkovaDlzkaRetazca = dlzkaRetazca + pravaStrana.dlzkaRetazca;
        Retazec docastny(celkovaDlzkaRetazca);

        int i, j;

        for (i = 0; i < dlzkaRetazca; i++)
        {
                docastny[i] = retazec[i];
        }
        for (j = 0; j < pravaStrana.dlzkaRetazca; i++, j++)
        {
                docastny[i] = pravaStrana[j];
        }
        docastny[celkovaDlzkaRetazca] = '\n';

        delete[] retazec;
        return docastny;
}
 
Odpovědět
16.7.2018 20:39
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na filL
Jindřich Máca:16.7.2018 22:54

Zdravím! Proč by se nemohl volat ten soukromý konstruktor? On se nemůže volat mimo danou třídu, ale uvnitř její implementace tomu nic nebrání, ba naopak, proto vlastně existuje. Kdyby se nemohl volat odnikud, tak by přeci neměl žádný účel. :)

 
Nahoru Odpovědět
16.7.2018 22:54
Avatar
Jindřich Máca
Tvůrce
Avatar
Jindřich Máca:16.7.2018 22:58

K lepšímu pochopení bych možná ještě doporučil pročíst místní seriál, kde se daná problematika vysvětluje - https://itnetwork.cz/…-zapouzdreni ;)

Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět
16.7.2018 22:58
Avatar
filL
Člen
Avatar
filL:17.7.2018 9:01

Aha ja som si neuvedomil ze je to volanie v metode triedy. Dakujem :)

 
Nahoru Odpovědět
17.7.2018 9:01
Avatar
filL
Člen
Avatar
filL:17.7.2018 9:04

pravde podobne ma zmiatlo to ze ta funkcia v ktorej sa volal ten sukromny konstruktor ako keby nepatrila tomu novemu objektu :) ak chapeš čo tym myslim. Dik za radu

 
Nahoru Odpovědět
17.7.2018 9:04
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 5 zpráv z 5.