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: Sháním C++ programátora

Aktivity
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:11.12.2012 22:17

V C++ klíčové slovo override existuje. Google napoví.

Odpovědět
11.12.2012 22:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:11.12.2012 22:55

Existuje ale jenom v C++/CLI a jinak až od C++11 což znamená že by musel programovat ve VS2012 jinak to neodpovídá standardu. Věděl sem že je to v Javě ale že to dali i do novýho standardu C++ sem netušil. Ten operátor ale nemá žádnej explicitní význam, jenom prevence proti chybě. V případě že přepisuješ virtuální funkci v odvozený třídě a použiješ nesouhlasnou signaturu, tak dostaneš error místo aby se vytvořila nová funkce.

 
Nahoru Odpovědět
11.12.2012 22:55
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 18:47

Tak dneska jsem to měl ukazovat bohužel se mi nepodařilo dostat do toho tohle:
UsporadanePole<Zlo­mek,20> pz;
typedef Zlomek Z;
pz << Z(1,3) << Z(3,5) << Z(7,4) << Z(3,4) << Z(2,3) << Z(7,2)
<< Z(5,4) << Z(1,4) << Z(6,7) << Z(4,3) << Z(2,3);

vyhazuje chyby a za boha jsem ve škole nemohl přijít na to proč... ve třídě zlomek jsem si i udělal přetížený operátory porovnání ale bezvýsledně. Nějaký nápad čím to je?

 
Nahoru Odpovědět
12.12.2012 18:47
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 19:02

Co to hlásí?

 
Nahoru Odpovědět
12.12.2012 19:02
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 19:35

error: no match for 'operator=' in 'pz = Zlomek(3, 6u)'|

 
Nahoru Odpovědět
12.12.2012 19:35
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 19:40

Pravděpodobně tvoje šablona třídy HashZlomky nemá přetíženej operátor =. V tom cos tu psal nahoře ale nikde žádný pz = zlomek(3,6) neni, kde to máš?

 
Nahoru Odpovědět
12.12.2012 19:40
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 19:44

Je to v tom zadání úplně dole jak je tam to:
UsporadanePole<Zlo­mek,20> pz;
typedef Zlomek Z;
pz << Z(1,3) << Z(3,5) << Z(7,4) << Z(3,4) << Z(2,3) << Z(7,2)
<< Z(5,4) << Z(1,4) << Z(6,7) << Z(4,3) << Z(2,3);
pz-=Z(6,7); pz-=Z(2,7);
cout << "pocet " << pz << endl;
pz.prvni();
do pz.aktual()(); while (pz.dalsi());
najit(pz,Z(1,4));
najit(pz,Z(7,2));
najit(pz,Z(1,2));

ano v té co jsem sem dával nejsou ale když jsem je zkoušel vytvořit tak to zase padalo na nich.

 
Nahoru Odpovědět
12.12.2012 19:44
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 19:56

Uploadni někam všechno co máš ať si to můžu zkompilovat sám a řekni mi jakej kompilátor používat.

 
Nahoru Odpovědět
12.12.2012 19:56
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 20:08

http://www.itnetwork.cz/dev-lighter/47 tady je zlomek
http://www.itnetwork.cz/dev-lighter/46 a tady od tebe to pole

používám codeblock a kompilátor mingw32-g++

 
Nahoru Odpovědět
12.12.2012 20:08
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 20:22

UsporadanePole se přece nemělo používat se třídou zlomek ne? Nemá pro ní přetížený operátory. A funkce najit tam vůbec neni. Nehledě na to že ve třídě Zlomek máš operátor > přetíženej 2x a on neví co použít, protože sedí oboje.

 
Nahoru Odpovědět
12.12.2012 20:22
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 21:07

No mělo protože on to tam dole plní těma zlomkama. Ty 2 operátory vidím to mi mohlo dojít podle těch 2 canditates v chybovým hlášení.

 
Nahoru Odpovědět
12.12.2012 21:07
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 22:17
template <typename T, int n>
class UsporadanePole
{
  public:
    unsigned int velikost;
    unsigned int iterator;
    T* pole;
    void swapf(T &, T &);
    T & find(T&,int,int);

  public:
    UsporadanePole();
    ~UsporadanePole(){delete [] pole;}
    UsporadanePole & operator<<(T);
    bool operator-=(T &);
    unsigned int operator()() const {return velikost;}
    const T *najit(T & prvek){return &find(prvek,0,velikost+1);}
    bool prvni();
    bool dalsi();
    T & aktual(){return pole[iterator];}
};



template <typename T, int n>
void UsporadanePole<T,n>::swapf(T & a, T & b)
{
  T c = a;
  a = b;
  b = c;
}

template <typename T, int n>
T & UsporadanePole<T,n>::find(T & prvek, int b, int e)
{
  int med = (e + b) / 2;
  if(prvek > pole[med])
  {
    if(med == b)
      return *((T*)0);
    else
      return find(prvek,med,e);
  }
  else if(prvek < pole[med])
  {
    if(med == e)
      return *((T*)0);
    else
      return find(prvek,b,med);
  }
  else
    return pole[med];
}

template <typename T, int n>
UsporadanePole<T,n>::UsporadanePole() : velikost(0), iterator(0)
{
  pole = new T[n];
}

template <typename T, int n>
UsporadanePole<T,n> & UsporadanePole<T,n>::operator<<(T prvek)
{
  if(velikost < n)
  {
    if(!najit(prvek))
    {
      pole[velikost] = prvek;
      for(int i=velikost;i>0 && pole[i]<pole[i - 1];i--)
        swapf(pole[i], pole[i - 1]);
      velikost++;
    }
  }
  return *this;
}

template <typename T,int n>
bool UsporadanePole<T,n>::operator-=(T & prvek)
{
  const T* p = najit(prvek);
  if(!p)
    return false;
  else
  {
    for(int i = p - pole;i<velikost - 1;i++)
      swapf(pole[i],pole[i + 1]);
    velikost--;
    return true;
  }
}

template <typename T,int n>
bool UsporadanePole<T,n>::prvni()
{
  iterator = 0;
  if(velikost == 0)
    return false;
  else
    return true;
}

template <typename T,int n>
bool UsporadanePole<T,n>::dalsi()
{
  if(iterator < velikost - 1)
  {
    iterator++;
    return true;
  }
  else
    return false;
}

Tady máš tu třídu upravenou, sice nevyhovuje zadání ale jinak se mi to nepovedlo.

  1. Některý členký funkce šablony UsporadanePole přebíraly jako parametr nebo vracely konstatní referenci na T (Zlomek). To byl první problém, protože buďto ten parametr předávali dál jako referenci nebo se přímo z vrácený reference volala další členská funkce. To se kompilátoru nelíbilo protože to bral tak že tu referenci změníš, což nesmíš když je const. Upřímně, nepovedlo se mi zjistit proč to tak bere, možná je chyba někde v třídě Zlomek.
  2. Pokud do pz přes operátor << nedáváš konkrétní instanci ale pouze hodnotu vytvořenou konstruktorem, tak ta funkce pro přetížení operátoru << nikdy nemůže přebírat referenci, ten konstruktor vytvoří objekt, vrátí jeho hodnotu a hned ho zase zruší, neni na co předat referenci.
  3. U členský funkce další sem zapomněl na vrácení true/false.
Editováno 12.12.2012 22:19
 
Nahoru Odpovědět
12.12.2012 22:17
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda
Onda.Zadnik:12.12.2012 23:04

Nevím mě to prostě nefunguje, pořád mě to hází chyby jako by neviděl o těch operatorech. Nechápu proč..

 
Nahoru Odpovědět
12.12.2012 23:04
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda:12.12.2012 23:31

Jo ještě jedna věc. Vypsat to přes cout nepude, protože nemáš definouvanou konverzi na nějakej typ kterej cout může vypsat, v tomhle případě int(nebo unsigned int). Druhá možnost by byla přetížit operátor << tak aby vracel objekt třídy ostream, ale ta koverzní funkce je asi jednodušší.
operator unsigned int(){return velikost;}

 
Nahoru Odpovědět
12.12.2012 23:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Tato diskuze byla označena moderátorem jako nekonstruktivní a myslíme si, že nemá pro veřejnost příliš vysokou hodnotu. Členy můžete samozřejmě stále oslovit soukromě a to formou zpráv nebo chatu.

Zobrazeno 14 zpráv z 64.