Ahojky, chtěla bych vás poprosit o radu. Ve škole jsem dostala projekt ve kterém mám vytvořit vhodné konstruktory, přetížené operátory pro: přiřazení, základní aritmetické operace a porovnávání zlomků. Chtěla jsem se tedy zeptat jak vytvořit, přetížený operátor. Mám doma nějakou literaturu pro javu, ale říkala jsem si, kdyby mi to mohl někdo vysvětlit a taky přímo pro C++. A taky jsem se ještě chtěla zeptat co to znamená že je metoda inline, jelikož v zadání mám ještě větičku: Ve vhodných případech metody implementujte jako inline.
Moc děkuju předem
Fórum › C / C++
Přetížení
Mno, janc1 ti sice uz odpovedel, ale kdyz uz jsem tu neco napsal, tak:
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 0.000001f;
class CFraction
{
long _numerator; //citatel
long _denominator; //jmenovatel
public:
CFraction(){}//inline definie(v tele tridy)
CFraction(long num, long den=1); // pretizeny konstruktor
CFraction(const CFraction& other); // Kopirovaci konstrutor-stacil by vychotzi
~CFraction();
CFraction& operator=(const CFraction& other); // operator prirazeni-stacil by vychotzi
//relacni operatory
bool operator==(const CFraction& other) const
{ double r = _numerator/(double)_denominator;
double l = other.GetNumerator()/(double)other.GetDenominator();
return (fabs(r-l) < epsilon);}
bool operator!=(const CFraction& other) const {return !(*this==other);}
bool operator<(const CFraction& other) const {
return _numerator/(double)_denominator < other.GetNumerator()/(double)other.GetDenominator();}
bool operator>(const CFraction& other) const {
return _numerator/(double)_denominator > other.GetNumerator()/(double)other.GetDenominator();}
CFraction operator*(const CFraction& other);
CFraction operator/(const CFraction& other);
//CFraction operator+(const CFraction& other);
void SetNumerator(long num) {_numerator = num;} // inline definice(neplset s klicovym slovem inline)
void SetDenominator(long den) {_denominator = den;}
inline long GetNumerator() const {return _numerator;}// pokud je oznacena klicovym slovem inline, tak se MUSI definovat uvnitr tridy
inline long GetDenominator() const {return _denominator;}
};
CFraction::CFraction(long num, long den)
: _numerator(num), _denominator(den)
{
}
CFraction::CFraction(const CFraction& other)
:_numerator(other.GetNumerator()), _denominator(other.GetDenominator())
{
}
CFraction::~CFraction()
{
}
CFraction& CFraction::operator=(const CFraction& other)
{ _numerator = other.GetNumerator();
_denominator =other.GetDenominator();
return *this;
}
CFraction CFraction::operator*(const CFraction& other)
{ //dodelat nejake to kraceni
return CFraction(_numerator*other.GetNumerator(), _denominator*other.GetDenominator());
}
CFraction CFraction::operator/(const CFraction& other)
{ //dodelat nejake to kraceni
return CFraction(_numerator*other.GetDenominator(), _denominator*other.GetNumerator());
}
int main(int argc, char *argv[])
{
CFraction c(1, 3), c2(3);
CFraction c3 = c/c2;
printf("%sn",(c < c2)?"je mensi":"je vetsi");
printf("%d/%dn",c3.GetNumerator() ,c3.GetDenominator());
system("PAUSE");
return EXIT_SUCCESS;
}
Panebože, zdá se mi to nebo Jurovi_ příklady jsou trochu složité ? :)
To Jura: jj to jsem si vsimla, ze je to tam neni :o) no mam na to jeste nejaky casek takze si stim zkusim pohrat, stejne to budu muset prepsat tak at tomu poradne rozumim ja, jelikoz muj profesor me docela drti a beztak bude chtit vysvetlit kazdy radecek kodu :o) dekuju ;o)
Tak mi to nedalo a upravil jsem deleni a nasobeni, tak aby byl schopen kratit. Casem mozna dodam i scitanise spol. jmenovatelem. Staci doplnit deklaraci GetNSD() a Reduction do tridy CFraction. Malem bych zapomnel dodat, ze lze take pretezovat operatory /=, *=, +=, -=, ale to se dozajista doctes nekde na netu.
CFraction CFraction::operator*(const CFraction& other)
{ //krati se do krize
long nsd = GetNSD(_numerator, other.GetDenominator()); //spocitam nejvetsiho spol delitele meyi citatelem prvniho zlomku a jmenovatelem druheho
long n1 = _numerator/nsd, d2 = other.GetDenominator()/nsd; // yapamatuju si novou hodnotu citatele a jmenovatele
nsd = GetNSD(_denominator, other.GetNumerator()); // tadz naopak
long d1 = _denominator/nsd, n2 = other.GetNumerator()/nsd;
return CFraction(n1*n2, d1*d2);
}
CFraction CFraction::operator/(const CFraction& other)
{ //Deleni je nasobeni prevracenou hodnotou druheho zlomku
return (*this)*CFraction(other.GetDenominator(), other.GetNumerator());
}
//Zdroj: http://encyklopedie.seznam.cz/heslo/125890-eukliduv-algoritmus
long CFraction::GetNSD(long a, long b)
{
long t;
while(b != 0){
t=a%b;
a=b;
b=t;
}
return a;
}
//zkrati zlomek(moyna je pouzijes)
void CFraction::Reduction()
{
long nsd = GetNSD(_numerator, _denominator);
_numerator/=nsd;
_denominator/=nsd;
}
To PaLaDiN:Rusit nebudu nic, kdyz si prectes puvodni dotaz, tak zjistis, ze Marik chtela vedet jaky je rozdil v inline definici narozdil od klasicke. Proto jsem pro ilustraci zvolil, jak definici vne tridy, tak uvnitr tridy. Ale pokud to vadi Tobe nebo ji nebo dokonce komukoliv jinemu, tak ho myslim nezabije natukat par radku kodu.
To Marik:
Pokud myslis metody, ktere jsou oznaceny klicovym slovem inline, pak jeho vyznam je jen jakymsi doporucenim pro kompilator, aby ty metody prelozil jinak nez klasicke funkce. U klasickych funkci se musi ulozit navrtova adresa, ulozit parametry(poradi urcuje volaci konvence) a spostu dalsich veci, ktere "zbytecne" zpomaluji a prave sluvko inline zajisti, aby kompilator prelozil funkce jako klasicka makra v C, tedy jejich kod dosadi do mista volani(proto by se mely funkce oznacene inline psat, co nejkratrsi). Jen jeste doplnim, ze kompilator to klidne muze ignorovat, takze se nic nestane,kdyz to tam neuvedes.
To Marik:
Ted se tak koukam, ze jsem ti asi neodpovedel ycela presne. Totiz existuje keyword inline(to jsem popsal vyse) a dalsi vyznam inline je jen ten, ze definici metody napises primo do tridy. To znamena, ze namsito abych psal:
class A
{
void NejakaMetoda();
};
void A::NejakaMetoda()
{
//neco delej
}
Tak napisu jen:
class A
{
NejakaMetoda()
{
//neco delej
}
};
To Jura: Proč jsi nepřetížil +?
To midin: Protoze jsem liny, ale specialne pro tebe:
long CFraction::GetLCM(long a, long b)
{ if(a>b)std::swap(a,b);
long n;
for( n = a ;(n%b); n+=a);
return n;
}
CFraction CFraction::operator+(const CFraction& other)
{
long lcm = GetLCM(_denominator, other.GetDenominator());
return
CFraction(_numerator*(lcm/other.GetDenominator())+(other.GetNumerator()*(lcm/_denominator)) , lcm);
}
Jinak tohle byl patrne skolni projekt a ja opravdu nema tolik casu, abych delal veci za druhe. Krome toho Marik chtela jen principy, jak pretezovat operatory, takze by ji stacil odkaz od janc1, jenze uz jsem to mel rozpracovane, takze jsem to postnul. Doufam, ze pretezit operator- uz kazdy zvladne sam(bud to analogicky jako je scitani, nebo si staci uvedomit ze odcitani je scitani s opacny znamenkem). Tecka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pretizeni [] .... — založil janek
Přetížení [] — založil koudiss
Přetížení fcí — založil !o!
Přetížení operátoru << — založil vollf82
Pretizeni operator[] — založil koudis
Moderátoři diskuze