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í.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
swift week + discount 30
Avatar
filL
Člen
Avatar
filL:13.8.2018 16:48

Dobrý deň prave sa ucim pretazovat operatory v C++. A nepochopil som jednej veci :

#include <iostream>

using namespace std;

class Zoznam
{
public:
        Zoznam() {}
        Zoznam(int Cislo) : cislo(Cislo) {}
        Zoznam(int *Cislo) { cislo = *Cislo; }
        friend Zoznam operator+(Zoznam, Zoznam &);
        Zoznam operator+(Zoznam  zoznam) { int celkoveCislo = cislo + zoznam.cislo; return Zoznam(celkoveCislo); }
        int vratCislo() { return cislo; }
private:
        int cislo =  9;
};

Zoznam operator+(Zoznam &, Zoznam &)
{

}

int main()
{
        int cislo = 5;
        Zoznam zoznam;
        Zoznam novyZoznam;

        zoznam.operator+(novyZoznam + cislo);

        novyZoznam = zoznam + cislo;

        novyZoznam = cislo + zoznam; // ako keby bol tento riadok napisany takto : novyZoznam( cislo.operator+(zoznam));

        cout << novyZoznam.vratCislo();


        system("PAUSE");
        return 0;
}

funkciu operator+(Zoznam &, Zoznam & som zatial nechal prazdnu.

Presnejsie nerozumiem tomuto riadku :

novyZoznam = cislo + zoznam; // ako keby bol tento riadok napisany takto : novyZoznam( cislo.operator+(zoznam));

nechapem ako to funguje. Preco musi byt operator+(Zoznam &, Zoznam &) priatelska z triedou Zoznam.

Dakujem za kazdu pomoc.

 
Odpovědět
13.8.2018 16:48
Avatar
martanec
Člen
Avatar
Odpovídá na filL
martanec:14.8.2018 8:24

Presnejsie nerozumiem tomuto riadku :
<code>novyZoznam = cislo + zoznam; // ako keby bol tento riadok napisany takto : novyZoznam( cislo.operator+(zoz­nam));</code>

cislo je premenna typu int, zoznam je objektom triedy Zoznam. Kedze mas implementovany implicitny konstruktor Zoznam(int Cislo) : cislo(Cislo) {}, udeje sa nesledovne:

- na cislo sa aplikuje spominany implicitny konstruktor a vznikne ti docasny nepomenovany objekt typu Zoznam.
- nad tymto objektom sa zavola clenska metoda operator+(Zoznam) a tato metoda ti vrati novy vysledny objekt, ktory sa skopiruje do premennej novyZoznam.

  • docasny nepomenovany objekt zanika

>nechapem ako to funguje. Preco musi byt operator+(Zoznam &, Zoznam &) priatelska z triedou Zoznam.

Klucove slovo friend ti dovoluje pristupovat k private a protected atributom danej triedy. V ludskej reci to znamena, ze ne-clenska funkcia Zoznam operator+(Zoznam &, Zoznam &) by nemala pristup na citanie/zapis pre private atribut cislo triedy Zoznam, keby nebola nadefinovana ako friend funkcia v triede Zoznam.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
14.8.2018 8:24
Avatar
filL
Člen
Avatar
filL:14.8.2018 11:42

dakujem velmi pekne

 
Nahoru Odpovědět
14.8.2018 11:42
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
filL
Člen
Avatar
Odpovídá na martanec
filL:14.8.2018 12:09

Počkať ale keby to bolo tak ako si hovoril, že sa vytvori docastny objekt a nad nim sa zavola operator+(zoznam) tak by nemalo zmysel vytvarat operator+(Zoznam, Zoznam &) - ale ak ju vymazem tak mi napise na tomto riadku:

novyZoznam = cislo + zoznam;

takze podla mna sa tam nejakym sposobom musi volat operator+(Zoznam, Zoznam&)

moja teoria je taka ze sa tam zavola operator+(Zoznam, Zoznam&) tam sa cislo premeni na Zoznam, zoznam sa priradi do Zoznam &. A potom sa v tejto funkcii pomocou operatora+(Zoznam) obydve zoznami prirataju a to co sa vrati z funkcie operator+(Zoznam) sa vrati a potom priradi do novyZoznam. Mohlo by to byt takto ? Dufam ze som to napisal zrozumitelne :D

 
Nahoru Odpovědět
14.8.2018 12:09
Avatar
martanec
Člen
Avatar
martanec:14.8.2018 14:09

vychadzal som na zaklade toho komentaru a pohyboval som sa v teoretickej rovine, pretoze ten kod aj tak neskompilujes. Je tam strasne vela chyb.

Skus zacat od zaciatku: definovanie a implementovania triedy Zoznam (atribut, konstruktory, getter/setter), vytvorenie objektu a vypis obsahu atributu na vystup. Samozrejme to treba skompilovat a spustit.

Potom skus pretazit operator+ jednym sposobom. (opat compile+run)

Dalej mozes skusit implementovat pretazenie operatoru+ dalsimi sposobmi. Zakazdym treba kod skompilovat a spustit.

A vzdy si skus ten kod aj zdebugovat. Debugovanie je najlepsi sposob ucenia/pochopenia, ako veci funguju ;)

 
Nahoru Odpovědět
14.8.2018 14:09
Avatar
filL
Člen
Avatar
filL:14.8.2018 20:05

Dakujem uz som to viac menej pochopil. Ale vazne mi to dalo nejak zabrat a pritom to je take jednoduche :) . Dakujem za pomoc .

 
Nahoru Odpovědět
14.8.2018 20:05
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 6 zpráv z 6.