Přetížení – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přetížení – C / C++ – Fórum – Programujte.comPřetížení – C / C++ – Fórum – Programujte.com

 

Kaja0
Duch
28. 11. 2006   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
janc1
~ Anonymní uživatel
98 příspěvků
28. 11. 2006   #2
-
0
-

prestuduj si toto -> http://lulu.t-mobile.sk/palcisko/skola/archiv/prog2/06.pdf

tam mas vysvetlene pretazovanie.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
28. 11. 2006   #3
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
Miroslav Kajan0
Věrný člen
28. 11. 2006   #4
-
0
-

Panebože, zdá se mi to nebo Jurovi_ příklady jsou trochu složité ? :)

Nahlásit jako SPAM
IP: ...–
Zápisky z dění na FB (momentálně ve vývoji): http://fbpd.ic.cz/
Kaja0
Duch
28. 11. 2006   #5
-
0
-

Zatím moc děkuju - zkusím teda nastudovat to co jste mi poslali a napsali, držte palce ať to zvládnu pochopit napoprvé :o)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
28. 11. 2006   #6
-
0
-

To midin: Co je na tom sloziteho???;) Malinko by se to zkomplikovalo, kdybych pouzil sablony, a ze jsem zvazoval.:)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
28. 11. 2006   #7
-
0
-

To Marik:
Jen te musim upozornit, ze trida CFraction neni kompletni - chybi operator pro scitani, odecitani. Taky by bylo dobre udelat nejake to kraceni a vyuzit jejpri nasobeni, resp. deleni.

Nahlásit jako SPAM
IP: ...–
Kaja0
Duch
28. 11. 2006   #8
-
0
-

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)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
28. 11. 2006   #9
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
Kaja0
Duch
28. 11. 2006   #10
-
0
-

Musim rict, ze jsi mi opravdu pomohl - jakmile budu mit zase volnou chvili tak se do toho pustim. Jo jeste jsem se chtela zeptat, co znamena ta metoda inline? Moc dekuju :o*

Nahlásit jako SPAM
IP: ...–
Pedro0
Stálý člen
28. 11. 2006   #11
-
0
-

To Jura: Prosimta, polku toho prveho prikladu vymaz lebo je to tam apsolutne zbytocne ... (napr konstruktory ... definuj ako inline ... destruktor a kopirovaci zrus .. su zbytocne)

Nahlásit jako SPAM
IP: ...–
Vsetci ste blazni, to len ja som lietadlo
Jura
~ Anonymní uživatel
637 příspěvků
29. 11. 2006   #12
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
29. 11. 2006   #13
-
0
-

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
}
};

Nahlásit jako SPAM
IP: ...–
Kaja0
Duch
1. 12. 2006   #14
-
0
-

Jeste jednou dekuju: jak to napisu ozvu se jak to dopadlo - drzte palecky

Nahlásit jako SPAM
IP: ...–
Miroslav Kajan0
Věrný člen
3. 12. 2006   #15
-
0
-

To Jura: Proč jsi nepřetížil +?

Nahlásit jako SPAM
IP: ...–
Zápisky z dění na FB (momentálně ve vývoji): http://fbpd.ic.cz/
Jura_0
Stálý člen
3. 12. 2006   #16
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Podobná vlákna

Pretizeni [] .... — založil janek

Přetížení [] — založil koudiss

Přetížení fcí — založil !o!

Pretizeni operator[] — založil koudis

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý