Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: Potrebujem pomoct s kodom :D

C a C++ C a C++ Potrebujem pomoct s kodom :D American English version English version

Aktivity (1)
Avatar
filL
Člen
Avatar
filL:16. července 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. července 20:39
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na filL
Jindřich Máca:16. července 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. července 22:54
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Jindřich Máca:16. července 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. července 22:58
Avatar
filL
Člen
Avatar
filL:17. července 9:01

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

 
Nahoru Odpovědět 17. července 9:01
Avatar
filL
Člen
Avatar
filL:17. července 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. července 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.