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í.
discount 30 + hiring

Diskuze: Nefungující konstruktor - chyba v zápisu ?

Aktivity
Avatar
Tomas Cizek
Člen
Avatar
Tomas Cizek:17.5.2018 20:16

Ahoj,
Učím se asi týden objektově programovat a narazil jsem na jeden problém s výchozím konstruktorem. Zkoušel jsem googlit, ale po pár hodinách zkusím štěstí tady.

Zde je první fungující kód, který je však napsaný jen v mainu a já se ho pokouším rozdělit do samostatných souborů (source, header).

#include <iostream>

using namespace std;

class mojeTrida {
  public:
    mojeTrida(string IniJmeno="Robert", int IniVaha=10) {

        nastavJmeno(IniJmeno);
        nastavVahu(IniVaha);
    }

    void nastavJmeno(string x) {
      jmeno = x;
    }

    void nastavVahu(int x){
    vaha=x;
    }

     string ziskejJmeno() {return jmeno;}
     int ziskejVahu(){return vaha;}

  private:
    string jmeno;
    int vaha;
};

int main() {
  mojeTrida ob1("Amy");
  mojeTrida ob2;

  cout<<"jmeno 1 objektu je: "<<ob1.ziskejJmeno()<<endl;
  cout<<"vaha 1 objektu je: "<<ob1.ziskejVahu()<<endl;
  cout<<"jmeno 2 objektu je: "<<ob2.ziskejJmeno()<<endl;
  cout<<"vaha 2 objektu je: "<<ob2.ziskejVahu()<<endl;

}

Zde mám druhý nefungující kód. V něm se právě snažím ten první rozdělit na tři samostatné soubory. Při pokusu o zavolání výchozího konstruktoru v main mi to však vyhodí chybu a já netuším proč.

Avšak pokud v main místo: mojeTrida ob1; napíšu: mojeTrida ob1("neco", 300); se dvěma parametry kompilátor chybu nevyhodí a normálně to funguje. PROČ ? :D

main.cpp

#include <iostream>
#include "mojeTrida.h"

using namespace std;


int main()
{


mojeTrida ob1;


cout<<ob1.ziskejJmeno();
cout<<ob1.ziskejVahu();

mojeTrida.h

#ifndef MOJETRIDA_H
#define MOJETRIDA_H
#include <iostream>

using namespace std;

class mojeTrida
{
    public:
        void nastavJmeno(string);
        string ziskejJmeno();

        void nastavVahu(int);
        int ziskejVahu();

        mojeTrida(string, int);
        ~mojeTrida();

    private:
        string jmeno;
        int vaha;
};

#endif // MOJETRIDA_H

mojeTrida.cpp

#include "mojeTrida.h"
#include <iostream>

using namespace std;

void mojeTrida::nastavJmeno(string x){jmeno=x;}
string mojeTrida::ziskejJmeno(){return jmeno;}

void mojeTrida::nastavVahu(int x){vaha=x;}
int mojeTrida::ziskejVahu(){return vaha;}

mojeTrida::mojeTrida(string IniJmeno="Tomas", int IniVaha=50)
{


    nastavJmeno(IniJmeno);
    nastavVahu(IniVaha);

}

mojeTrida::~mojeTrida(){
}
Editováno 17.5.2018 20:18
 
Odpovědět
17.5.2018 20:16
Avatar
Patrik Valkovič
Člen IT Redactor Gang
Avatar
Odpovídá na Tomas Cizek
Patrik Valkovič:17.5.2018 20:22

Nemám teď čas to testovat, ale myslím si, že výchozí hodnoty musí být v hlavičkovém souboru.

EDIT: možná jen v hlavičkovém, možná v hlavičkovém i implementačním, vyzkoušej co bude fungovat.

Editováno 17.5.2018 20:22
Nahoru Odpovědět
17.5.2018 20:22
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Tomas Cizek
Člen
Avatar
Odpovídá na Patrik Valkovič
Tomas Cizek:17.5.2018 20:29

Díky moc ! Zkusil jsem a funguje. Když už jsem ale tady, tak se zeptám ještě na něco.
Když napíšu:
mojeTrida ob1("marcela");
Tak v pohodě. Vypíše se marcela 20

Jenže když napíšu jen váhu:
mojeTrida ob1(2);
Tohle už nejde.

Jde to nějak vyřešit ? Nebo jaké znalosti je potřeba mít, aby se to vyřešit dalo ?

Editováno 17.5.2018 20:30
 
Nahoru Odpovědět
17.5.2018 20:29
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Patrik Valkovič
Člen IT Redactor Gang
Avatar
Odpovídá na Tomas Cizek
Patrik Valkovič:17.5.2018 20:32

K tomu můžeš využít pouze přetěžování. Funguje stejně jako u funkcí.
Parametry se zadávají zleva doprava. Nemůžeš žádný přeskočit, i když má výchozí hodnotu. Proto druhý příklad nefunguje.

Nahoru Odpovědět
17.5.2018 20:32
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Tomas Cizek
Člen
Avatar
Tomas Cizek:17.5.2018 20:35

Díky moc :-)

 
Nahoru Odpovědět
17.5.2018 20:35
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.