Diskuze: Sháním C++ programátora
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 14 zpráv z 64.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
Tak dneska jsem to měl ukazovat bohužel se mi nepodařilo dostat do toho
tohle:
UsporadanePole<Zlomek,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?
error: no match for 'operator=' in 'pz = Zlomek(3, 6u)'|
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áš?
Je to v tom zadání úplně dole jak je tam to:
UsporadanePole<Zlomek,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.
Uploadni někam všechno co máš ať si to můžu zkompilovat sám a řekni mi jakej kompilátor používat.
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++
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.
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í.
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.
Nevím mě to prostě nefunguje, pořád mě to hází chyby jako by neviděl o těch operatorech. Nechápu proč..
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;}
Zobrazeno 14 zpráv z 64.