C++ friend klase

poruka: 21
|
čitano: 5.236
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
C++ Klase

 

Postovani majstori i genijalci iam nekakvih nedoumica u vezi obicnih klasa u C++-u:

Radi se o "friend" klasi koja bi treba obaviti obicnu matematicku operaciju:

 

 

 

 

#include <iostream>

#include<math.h>

using namespace std;

 

class strelok {

   int width, height;

  public:

   void set_values (int, int);

   int vrati_vriednost () {return (width * height);}

   friend strelok prijatelj_fun (strelok);

};

 

void strelok::set_values (int a, int b) {

  width = a;

  height = b;

}

 

strelok prijatelj_fun (strelok varijabla)

{

  strelok varijabla2;

  varijabla2.width = varijabla.width*2;//Tu sam probao: varijabla2.with= pow((varijabla.with),2);

  varijabla2.height = varijabla.height*2;//Takodjer: varijabla2.height= pow((varijabla.height),2);

//Kompajler veli error C2661: 'pow' : no overloaded function takes 1 arguments. Sta sad to znaci?

 

  return (varijabla2);

}

 

int main () {

 int br1, br2;

  strelok rect, rectb;

  cout<<"unesi prvi broj: ";

  cin>>br1;

  cout<<"\nUnesi drugi broj: ";

  cin>>br2;

  rect.set_values (br1,br2);

  cout<<"\nUmnozak broja "<<br1<<"* "<<br2<<"= "<<rect.vrati_vriednost()<<endl;

  rectb = prijatelj_fun (rect);

  cout << "\nUmnozak njihovog kvadrata je: "<<rectb.vrati_vriednost()<<endl;

  return 0;

}

 

 

Obicni pow radi:

int a, x=5;

a=pow(x,2);

 

E sad nikako da skuzim kako da vratim  objektu "rectb" pravu vrijednost funkcije "pow()".Tu bih molio pomoć od vas.

 

e da i jos nesto:

 

strelok prijatelj_fun (strelok varijabla)//dali je "varijabla" objekt tipa klase "strelok" ili je to varijabla tipa klase "strelok"??

{

  strelok varijabla2;

  varijabla2.width = varijabla.width*2;

  varijabla2.height = varijabla.height*2;

 

  return (varijabla2);

}

 

 

 

Poruka je uređivana zadnji put sri 1.12.2010 14:48 (Mr_B).
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: C++ Klase

probaj ovo:

varijabla2.width = pow(static_cast<double>(varijabla.width),2); // Pow prima double/float, a ne int. provjeri dokumentaciju il' nešto...

nije mi jasno ono za pitanje za varijablu{#}, strelok prijatelj_fun (strelok varijabla) -  znači da će funkcija primiti objekt tipa strelok imena varijabla i vratiti isti taj tip;

17 godina
moderator
online
RE: C++ Klase

Mene cijeli primjer zbunjuje. Nemam iskustva s friend funkcijama i klasama, ali ovlas pogledavsi na ovoj stranici: http://www.codersource.net/c/c-tutorials/c-tutorial-friend.aspx

 

nije mi jasna linija pokretaca teme:

 

friend strelok prijatelj_fun (strelok);

 

Jel je to dopusteno u C++-u? Argument je naziv klase, bez imena varijable. Takodjer, u tom primjer ne radi se o friend klasi, nego o friend funkciji.

16 godina
neaktivan
offline
RE: C++ Klase

Prijateljskoj funkciji prosljeđuješ objekte klase kao parametre jer se radi o prijateljskoj funkciji .Znači cijeloj funkciji proslijeđuješ objekt.

 

 

friend strelok prijatelj_fun (strelok);

 

Ovaj navod od mbakse je dobro označen jer nikada ne deklariram bez objekta te klase .Ovakvo deklariranje nije baš dobra praksa u C++-u.

 

 

Private
Poruka je uređivana zadnji put sri 1.12.2010 20:00 (Private).
17 godina
moderator
online
RE: C++ Klase

BTW Mr_B... Znas ti kako se racuna kvadrat? Broj pomnozis sa samim sobom - i rijesen problem - rezultat ce biti ispravan.

 

Sad sam se malo igrao s pow-om i skuzio da baca krive vrijednosti, pod Dev-C++-om. Naime, pow zna srezati rezultat na manji broj. Npr. ako napravis pow(varijabla.height, 2), a da je vrijednost varijabla.height 5, sto bi trebalo biti tocno 25, ispadne 24! Ako rucno upises bas brojku 5 umjesto varijable, dobit ces rezultat 25. Cudno...

 

Ako ti zaista treba pow funkcija, ovdje su ljudi napisali svoje alternativne funkcije koje bi trebale vracati ispravne vrijednosti: http://stackoverflow.com/questions/1505675/power-of-an-integer-in-c

17 godina
offline
C++ friend klase

Ovako radi :

 

#include <iostream>
#include<math.h>
using namespace std;
 
class strelok {
   int width, height;
  public:
   void set_values (int, int);
   int vrati_vriednost () {return (width * height);}
   friend strelok prijatelj_fun (strelok &);
};
 
void strelok::set_values (int a, int b) {
  width = a;
  height = b;
}
 
strelok prijatelj_fun (strelok &varijabla)
{
  strelok varijabla2;
  varijabla2.width = pow((double) varijabla.width, 2);//Tu sam probao: varijabla2.with= pow((varijabla.with),2);
  varijabla2.height = pow((double) varijabla.height, 2);//Takodjer: varijabla2.height= pow((varijabla.height),2);
//Kompajler veli error C2661: 'pow' : no overloaded function takes 1 arguments. Sta sad to znaci?
 
  return (varijabla2);
}
 
int main () {
 int br1, br2;
  strelok rect, rectb;
  cout<<"unesi prvi broj: ";
  cin>>br1;
  cout<<"\nUnesi drugi broj: ";
  cin>>br2;
  rect.set_values (br1,br2);
  cout<<"\nUmnozak broja "<<br1<<"* "<<br2<<"= "<<rect.vrati_vriednost()<<endl;
  rectb = prijatelj_fun (rect);
  cout << "\nUmnozak njihovog kvadrata je: "<<rectb.vrati_vriednost()<<endl;
  return 0;
}

Poruka je uređivana zadnji put sri 1.12.2010 21:11 (Floki).
 
0 0 hvala 0
17 godina
moderator
online
RE: C++ friend klase

Meni u Dev-C++-u ne radi. Za brojeve 2 i 5 izbaci rezultat 96 (2^2 * 5^2 != 4 * 24)! Umjesto 100. Mozda s nekim drugim kompajlerom radi kako treba.

17 godina
offline
C++ friend klase

U MS C++ radi , izbacuje 100 za brojeve 2 i 5

bit će da je pow nestabilan u Dev-u

doduše, ovdje preko reference ubacuje objekt, pa vraća objekt iz funkcije kojeg kopira u objekt main funkcije, negdje se Dev izgubio u tome

Poruka je uređivana zadnji put sri 1.12.2010 21:20 (Floki).
 
0 0 hvala 0
17 godina
offline
RE: C++ Klase

e da i jos nesto:

 

strelok prijatelj_fun (strelok varijabla)//dali je "varijabla" objekt tipa klase "strelok" ili je to varijabla tipa klase "strelok"??

{

  strelok varijabla2;

  varijabla2.width = varijabla.width*2;

  varijabla2.height = varijabla.height*2;

 

  return (varijabla2);

}

 

 

 

varijabla je ovdje objekt klase strelok, međutim u prijateljskoj funkciji ona se proslijeđuje kao referenca

 

 

strelok prijatelj_fun (strelok &varijabla)
{
  strelok varijabla2;
  varijabla2.width = pow((double) varijabla.width, 2);
  varijabla2.height = pow((double) varijabla.height, 2);
 
  return (varijabla2);
}

Poruka je uređivana zadnji put sri 1.12.2010 21:39 (Floki).
17 godina
moderator
online
RE: C++ friend klase
Floki kaže...

U MS C++ radi , izbacuje 100 za brojeve 2 i 5

bit će da je pow nestabilan u Dev-u

doduše, ovdje preko reference ubacuje objekt, pa vraća objekt iz funkcije kojeg kopira u objekt main funkcije, negdje se Dev izgubio u tome

Nema veze s tim. Dev-C++ (bar ovaj wxDev-C++ koji ja trenutacno koristim) izgubi se vec u ovom kodu:

 

#include <cstdlib>#include <iostream>#include <math.h>
using namespace std;
int main(int argc, char *argv[]){      int broj = 5;      int rezultat1 = pow(5, 2);      int rezultat2 = pow((double)broj, 2);   
      cout << "Kvadrat broja 5 je: \n1) " << rezultat1 << "\n2) " << rezultat2 << endl << endl;     
      system("PAUSE");
      return EXIT_SUCCESS;}

 

Meni pod 1 ispise 25, pod 2 ispise 24.

 

Poruka je uređivana zadnji put sri 1.12.2010 21:50 (mbaksa).
17 godina
offline
C++ friend klase

Baš čudno, meni je MS C++ izbacio u obje linije 25,

s tim da mi je syntax checker odmah signalizirao grešku u ovoj liniji

int rezultat1 = pow(5, 2);

pa sam stavio

int rezultat1 = pow(5., 2);

 

 

možda bi se trebalo staviti static_cast<double> umjesto (double), ne znam

Poruka je uređivana zadnji put sri 1.12.2010 22:00 (Floki).
 
0 0 hvala 0
17 godina
moderator
online
RE: C++ friend klase
Floki kaže...

Baš čudno, meni je MS C++ izbacio u obje linije 25,

s tim da mi je syntax checker odmah signalizirao grešku u ovoj liniji

int rezultat1 = pow(5, 2);

pa sam stavio

int rezultat1 = pow(5., 2);

Ma, ta linija ni nije nesto osobito bitna. Ali da, zbilja cudno - ocito u Dev-C++-u kod pretvaranja povratne vrijednosti funkcije pow ispada kao da rezultat nije 25, nego 24.999999999999999, pa ga kod pretvaranja u int sreze na 24. Zanimljivo je da se kod ispisa cout << pow((double)broj, 2) ispise broj 25, a ako to typecastas u int, dakle cout << (int)pow((double)broj, 2), ispise se 24.

 

Molio bih ako jos netko ima Dev-C++ ili neki treci razvojni alat/kompajler, da proba pa da javi sto mu ispise kod koji sam napisao u prethodnoj poruci.

17 godina
offline
C++ friend klase

Dev-u ne smeta

int rezultat1 = pow(5, 2);

ja moram u MS C++ jedan argument staviti kao doube

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ friend klase

evo ti s g++

 

ephoenix@Phoenix ~ $ ./a.out
Kvadrat broja 5 je:
1) 25
2) 25

sh: PAUSE: not found

In Control... MNOGE države imaju mafiju. Ali u Hrvatskoj mafija ima državu...
17 godina
moderator
online
RE: C++ friend klase
Floki kaže...

Dev-u ne smeta

int rezultat1 = pow(5, 2);

ja moram u MS C++ jedan argument staviti kao doube

Ako pogledas referencu za funkciju pow u standardnom C++-u, vidis da nema verzije funkcije pow koja bi kao prvi argument prihvacala int. To ili Dev-C++ sam typecasta u double (ili float) ili su dodali funkciju s int-om kao prvim argumentom.

17 godina
moderator
online
RE: C++ friend klase
EnlightenedPhoenix kaže...

evo ti s g++

 

ephoenix@Phoenix ~ $ ./a.out
Kvadrat broja 5 je:
1) 25
2) 25

sh: PAUSE: not found

Onda je vjerojatno posrijedi bug u MingW-u...

17 godina
offline
C++ friend klase

A ovako:

 

 

#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{   
    int broj = 5;   
    int rezultat1 = pow(5., 2);   
    int rezultat2 = pow(static_cast<double>(broj), 2); 
    cout << "Kvadrat broja 5 je: \n1) " << rezultat1 << "\n2) " << rezultat2 << endl << endl;  
    system("PAUSE");
    return EXIT_SUCCESS;}

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ friend klase
na g++ isti rezultati kao i s onim...

kako reče mbaksa... vjerojatno greška u mingW
In Control... MNOGE države imaju mafiju. Ali u Hrvatskoj mafija ima državu...
17 godina
moderator
online
RE: C++ friend klase

Ista stvar. Nevjerojatno - ako saljes konstantu, sve OK, ako saljes varijablu - krivo racuna.

 

-----------

 

Isao sam bas gledat math.h isporucen s Dev-C++-om i ima se sto za vidjeti - pise:

 

/* Excess precision when using a 64-bit mantissa for FPU math ops can
    cause unexpected results with some of the MSVCRT math functions.  For
    example, unless the function return value is stored (truncating to
    53-bit mantissa), calls to pow with both x and y as integral values
    sometimes produce a non-integral result.
    One workaround is to reset the FPU env to 53-bit mantissa
    by a call to fesetenv (FE_PC53_ENV).  Amother is to force storage
    of the return value of individual math functions using wrappers.
    NB, using these wrappers will disable builtin math functions and
    hence disable the folding of function results at compile time when
    arguments are constant.  */

 

-----------

 

Rjesenje? U program dodati:

 

#include <fenv.h>

 

i

 

fesetenv (FE_PC53_ENV);

 

-----------

 

Svasta... Svjesni su problema, ali nisu sami sprijecili da do njega ne bi dolazilo...

Poruka je uređivana zadnji put sri 1.12.2010 22:30 (mbaksa).
17 godina
offline
C++ friend klase

Hmm, interesantno

Ma ja sam toliko naučio na ovaj moj MS C++ 2010, samo radi syntax checker-a ne bi ga mijenjao ni za kojeg drugog, btw. ne znam imaju li drugi uopće nešto slično kao Intellisense,

kolika se prašina digla jer MS nije uveo tu podršku za CLR aplikacije u C++ (namjerno sigurno)

 
0 0 hvala 0
15 godina
neaktivan
offline
C++ friend klase

Ekipa svaka vam cast!

Hvala na objasnjenjima i razlicitim rjesenjima.

 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice