Discussion:
overload operatora
(prestaro za odgovor)
damirvk
2011-05-18 21:47:26 UTC
Permalink
Kako napisati funkciju za overload operatora za zbrajanje, pri cemu se
zbrajaju povrsine trokuta unutar ove klase? Formula za P trokuta je
povr=sqrt(s*(s-a)*(s-b)*(s-c)), gdje je s poluopseg trokuta. To mi se trazi
na ispitu, a ne znam sto bih trebao dobiti s tim operatorom u odnosu na
obicno zbrajanje povrsina?!
Hvala!

class Trokut{
private:
int a, b, c;
public:
Trokut(int c_a, int c_b, int c_c): a(c_a), b(c_b), c(c_c){}
Trokut(){
a=3;
b=4;
c=5;
}
int Opseg(){
return a+b+c;
}

float Povrsina(){
float s,povr;
s=Opseg()/2;
povr=sqrt(s*(s-a)*(s-b)*(s-c));
return povr;
}
};

Pozdrav!
Zeljko Vrba
2011-05-19 06:14:44 UTC
Permalink
Post by damirvk
Kako napisati funkciju za overload operatora za zbrajanje, pri cemu se
zbrajaju povrsine trokuta unutar ove klase? Formula za P trokuta je
povr=sqrt(s*(s-a)*(s-b)*(s-c)), gdje je s poluopseg trokuta. To mi se trazi
na ispitu, a ne znam sto bih trebao dobiti s tim operatorom u odnosu na
obicno zbrajanje povrsina?!
Hvala!
Uh, tvoj post je odlican primjer loseg dizajna i implementacije :-P [Al kostur
koda vjerojatno dolazi od profe, pa nije direktno tvoj zaj*] Kao prvo, tri
broja ne definiraju uvijek trokut (npr. ne postoji trokut sa stranicama duljine
1, 2 i 7), dakle moguce je imati instance klase Trokut koje zapravo nisu
trokuti. Kao drugo, Heronova formula je jako numericki nestabilna i NE VALJA ju
koristiti u "sirovoj formi" za izracunavanje povrsine. Kao trece, overloadati
+ na nacin kako si opisao je jedna od mutavijih ideja koje sam vidio u svojoj
karijeri (u rangu definiranja operatora - nad stringovima; vidjeno u praksi).

Vjerojatno se trazi sljedeci kod:

float operator+(const Trokut &t1, const Trokut &t2)
{ return t1.Povrsina() + t2.Povrsina(); }

(Eh da, moras deklarirati i Povrsina() kao const-metodu.)

Ono sto "dobivas" je odlican nacin obfuskacije programa. Bez overloadanog
operatora moras pisati

Trokut t1, t2;

float x = t1.Povrsina() + t2.Povrsina();

Sa overloadanim operatorom mozes pisati

float x = t1 + t2;

Koja od dvije linije je laksa za razumjeti, odluci sam :P
ToMo
2011-05-19 07:04:02 UTC
Permalink
Post by Zeljko Vrba
Koja od dvije linije je laksa za razumjeti, odluci sam :P
A i default ctor s 3,4,5 nije bas uobicajeno.
:)
--
ToMo
nosonja
2011-05-19 08:49:53 UTC
Permalink
Post by Zeljko Vrba
Post by damirvk
Kako napisati funkciju za overload operatora za zbrajanje, pri cemu se
zbrajaju povrsine trokuta unutar ove klase? Formula za P trokuta je
povr=sqrt(s*(s-a)*(s-b)*(s-c)), gdje je s poluopseg trokuta. To mi se trazi
na ispitu, a ne znam sto bih trebao dobiti s tim operatorom u odnosu na
obicno zbrajanje povrsina?!
Hvala!
Uh, tvoj post je odlican primjer loseg dizajna i implementacije :-P [Al kostur
koda vjerojatno dolazi od profe, pa nije direktno tvoj zaj*] Kao prvo, tri
broja ne definiraju uvijek trokut (npr. ne postoji trokut sa stranicama duljine
1, 2 i 7), dakle moguce je imati instance klase Trokut koje zapravo nisu
trokuti.
Trivijala je dodati provjeru da li je suma bilo koje dvije stranice veća od treće.
Post by Zeljko Vrba
Kao drugo, Heronova formula je jako numericki nestabilna i NE VALJA ju
koristiti u "sirovoj formi" za izracunavanje povrsine. Kao trece, overloadati
+ na nacin kako si opisao je jedna od mutavijih ideja koje sam vidio u svojoj
karijeri (u rangu definiranja operatora - nad stringovima; vidjeno u praksi).
float operator+(const Trokut &t1, const Trokut &t2)
{ return t1.Povrsina() + t2.Povrsina(); }
(Eh da, moras deklarirati i Povrsina() kao const-metodu.)
Ono sto "dobivas" je odlican nacin obfuskacije programa. Bez overloadanog
operatora moras pisati
Trokut t1, t2;
float x = t1.Povrsina() + t2.Povrsina();
Sa overloadanim operatorom mozes pisati
float x = t1 + t2;
Koja od dvije linije je laksa za razumjeti, odluci sam :P
Začudio bi se koliko ljudi se pali na takav tip obfuskacije uz objašnjenja tipa "na rubu znanosti" :-)
damirvk
2011-05-19 11:47:48 UTC
Permalink
"Zeljko Vrba" wrote in message news:***@fly.srk.fer.hr...
Vjerojatno se trazi sljedeci kod:
float operator+(const Trokut &t1, const Trokut &t2)
{ return t1.Povrsina() + t2.Povrsina(); }



Željko, hvala na pomoći i mislio sam da je to mutavo, al evo sad sam dobio i
potvrdu :-) !

Loading...