[ ena_m @ 23.11.2009. 20:34 ] @
imam klasu Razlomak sa privatnim podacima brojnik i nazivnik; i imam izvedenu klasu drugiRazlomak; unutar izvedene klase drugiRazlomak trebam da koristim privatne podatke osnovne klase Razlomak. ne znam kako, mozetel' mi pomoci?
[ t0d0r @ 23.11.2009. 20:48 ] @
private clanovi klase nisu dostupni izvedenoj klasi...Da bi ih koristila u izvedenoj klasi,
umesto kljucne reci private stavi protected. Protected clanovi i metode su potpuno vidljivi u izvedenim klasama
a u svim ostalim slucajevima se ponasaju kao private...

[ ena_m @ 23.11.2009. 21:06 ] @
hmmmm, imam i dalje isti problem, tj. kad promijenim private u protected i dalje mi javlja gresku da koristim sada protected clanove ?!
[ Mihajlo Cvetanović @ 23.11.2009. 22:46 ] @
E pa onda stavi public... Šta u stvari želiš da postigneš? Svrha tih public, protected i private je u velikim projektima, gde ima više programera, i gde su podeljena zaduženja. Ako si jedina na projektu za početak stavi svuda public, a kasnije ćeš shvatiti čemu sve to služi.
[ Nedeljko @ 23.11.2009. 23:38 ] @
Ma, kakav public. Čovek radi zadatak za vežbu iz pravilne upotrebe koncepata. Okači ti ovde problematičan kod, pa da vidimo.
[ ena_m @ 24.11.2009. 14:00 ] @
ima nekih gresaka jos u kodu al mi najvise stvara problem to sto mi javlja da su mi brojnik i nazivnik private, a moram doci do njih, a evo koda:

int nzd(int brojnik, int nazivnik)
{
int ostatak=1;
while (ostatak != 0)
{
ostatak=brojnik%nazivnik;
brojnik=nazivnik;
nazivnik=ostatak;
}
return brojnik;
}

//osnovna klasa
class Razlomak {
int brojnik;
int nazivnik;
public:
Razlomak () { brojnik=0; nazivnik=1; }
Razlomak ( int cijeli ) { Razlomak::brojnik=cijeli; Razlomak::nazivnik=1;}
Razlomak ( int br, int naz ) { brojnik = br; nazivnik = naz;}

void ispis ()const;

void pojednostavi();

friend Razlomak operator + (Razlomak razlomak1, Razlomak razlomak2)
{return Razlomak(razlomak1.brojnik*razlomak2.nazivnik + razlomak2.brojnik*razlomak1.nazivnik, razlomak1.nazivnik*razlomak2.nazivnik);}
friend Razlomak operator - (Razlomak razlomak1, Razlomak razlomak2)
{return Razlomak(razlomak1.brojnik*razlomak2.nazivnik - razlomak2.brojnik*razlomak1.nazivnik,razlomak1.nazivnik*razlomak2.nazivnik);}
friend Razlomak operator * (Razlomak razlomak1, Razlomak razlomak2)
{return Razlomak (razlomak1.brojnik * razlomak2.brojnik,razlomak1.nazivnik * razlomak2.nazivnik);}
friend Razlomak operator / (Razlomak razlomak1, Razlomak razlomak2)
{return Razlomak (razlomak1.brojnik * razlomak2.nazivnik,razlomak1.nazivnik * razlomak2.brojnik);}

friend bool operator == (Razlomak&, Razlomak&);

friend ostream& operator << (ostream&, Razlomak);
friend istream& operator >> (istream&, Razlomak&);

/* void doubleUrazlomak(double){}
friend bool operator < (Razlomak&, Razlomak&) {}
friend bool operator > (Razlomak&, Razlomak&) {}
friend bool operator <= (Razlomak&, Razlomak&) {}
friend bool operator >= (Razlomak&, Razlomak&) {}*/


~Razlomak(){cout << endl<< " " << endl;};
};


void Razlomak::ispis()const
{
cout << brojnik << "/"<< nazivnik;
}
void Razlomak::pojednostavi()
{
int ostatak=nzd(brojnik,nazivnik);


brojnik=brojnik/ostatak;
nazivnik=nazivnik/ostatak;

}


bool operator == (Razlomak &razlomak1, Razlomak &razlomak2)
{
if (razlomak1.brojnik != razlomak2.brojnik)
return false;
else if (razlomak1.nazivnik != razlomak2.nazivnik)
return false;
else
return true;
}




ostream& operator << (ostream &os, Razlomak razlomak1)
{
cout << "raz7 = ";
os << razlomak1.brojnik << "/" << razlomak1.nazivnik << endl;
return os;
}

istream& operator >> (istream &is, Razlomak &razlomak1)
{
is >> razlomak1.brojnik >> razlomak1.nazivnik;
return is;
}



//izvedena klasa
class mojRazlomak : public Razlomak
{
public:
void doubleUrazlomak(double dec);
friend bool operator < (Razlomak&, Razlomak&);
friend bool operator > (Razlomak&, Razlomak&);
friend bool operator <= (Razlomak&, Razlomak&);
friend bool operator >= (Razlomak&, Razlomak&);

~mojRazlomak(){};
};

void doubleUrazlomak(double dec)
{
int sprintf(char *dec);
}

bool operator < (Razlomak razlomak1, Razlomak razlomak2)
{
if (razlomak1.brojnik/razlomak1.nazivnik < razlomak2.brojnik/razlomak2.nazivnik)
return true;
else
return false;
}

bool operator > (Razlomak razlomak1, Razlomak razlomak2)
{
if (razlomak1.brojnik/razlomak1.nazivnik > razlomak2.brojnik/razlomak2.nazivnik)
return true;
else
return false;
}

bool operator <= (Razlomak razlomak1, Razlomak razlomak2)
{
if (razlomak1.brojnik/razlomak1.nazivnik <= razlomak2.brojnik/razlomak2.nazivnik)
return true;
else
return false;
}

bool operator >= (Razlomak razlomak1, Razlomak razlomak2)
{
if (razlomak1.brojnik/razlomak1.nazivnik >= razlomak2.brojnik/razlomak2.nazivnik)
return true;
else
return false;
}



int main(void)
{

Razlomak raz1(9,2);

Razlomak raz2(5,2);
Razlomak raz3,raz4,raz5,raz6,raz7,raz8,raz9,raz10,raz11;

cout<<"raz1 = ";
raz1.ispis();
cout<<endl;
cout<<"raz2 = ";
raz2.ispis();
cout<<endl;

cout<<"unosenje brojnika i nazivnika za operatore ostream i istream:"<<endl;
cin>>raz7;
cout<<raz7;

cout<<"preoptereceni operator + prije skracivanja:";
raz3=raz1+raz2;
raz3.ispis();
cout<<endl;
cout<<"preoptereceni operator + poslije skracivanja:"<<endl<<endl;
raz3.pojednostavi();
raz3.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator - prije skracivanja:";
raz4=raz1-raz2;
raz4.ispis();
cout<<endl;
cout<<"preoptereceni operator - poslije skracivanja:"<<endl<<endl;
raz4.pojednostavi();
raz4.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator * prije skracivanja:";
raz5=raz1*raz2;
raz5.ispis();
cout<<endl;
cout<<"preoptereceni operator * poslije skracivanja:"<<endl<<endl;
raz5.pojednostavi();
raz5.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator / prije skracivanja:";
raz6=raz1/raz2;
raz6.ispis();
cout<<endl;
cout<<"preoptereceni operator / poslije skracivanja:"<<endl<<endl;
raz6.pojednostavi();
raz6.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator + uz konverziju tipa int u tip razlomak, prije skracivanja:";
raz8=raz1+Razlomak(5);
raz8.ispis();
cout<<endl;
cout<<"preoptereceni operator + uz konverziju tipa int u tip razlomak, poslije skracivanja:"<<endl<<endl;
raz8.pojednostavi();
raz8.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator - uz konverziju tipa int u tip razlomak, prije skracivanja:";
raz9=raz1-Razlomak(5);
raz9.ispis();
cout<<endl;
cout<<"preoptereceni operator - uz konverziju tipa int u tip razlomak, poslije skracivanja:"<<endl<<endl;
raz9.pojednostavi();
raz9.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator * uz konverziju tipa int u tip razlomak, prije skracivanja:";
raz10=raz1*Razlomak(5);
raz10.ispis();
cout<<endl;
cout<<"preoptereceni operator * uz konverziju tipa int u tip razlomak, poslije skracivanja:"<<endl<<endl;
raz10.pojednostavi();
raz10.ispis();
cout<<endl<<endl;

cout<<"preoptereceni operator / uz konverziju tipa int u tip razlomak, prije skracivanja:";
raz11=raz1/Razlomak(5);
raz11.ispis();
cout<<endl;
cout<<"preoptereceni operator / uz konverziju tipa int u tip razlomak, poslije skracivanja:"<<endl<<endl;
raz11.pojednostavi();
raz11.ispis();
cout<<endl<<endl;

cout<<"jednakost razlomaka raz1 i raz2 (ispisuje 1-ako su jednaki, 0-ako nisu):"<<endl<<endl;
raz1.pojednostavi();
raz2.pojednostavi();
cout<<(raz1==raz2)<<endl<<endl;

mojRazlomak razlomak,razlomak1,razlomak2;
razlomak.doubleUrazlomak(3.14);

cout << "razlomak1 je manji od razlomka2 (ispisuje 1 ako jest, a 0 ako nije) ";
cout << (razlomak1<razlomak2)<<endl<<endl;
cout << "razlomak1 je veci od razlomka2 (ispisuje 1 ako jest, a 0 ako nije) ";
cout << (razlomak1>razlomak2)<<endl<<endl;
cout << "razlomak1 je manji ili jednak razlomku2 (ispisuje 1 ako jest, a 0 ako nije) ";
cout << (razlomak1<=razlomak2)<<endl<<endl;
cout << "razlomak1 je veci ili jednak razlomku2 (ispisuje 1 ako jest, a 0 ako nije) ";
cout << (razlomak1>=razlomak2)<<endl<<endl;

system("pause");

return 0;
}
[ Mihajlo Cvetanović @ 24.11.2009. 14:41 ] @
Ako članice moraju da budu private (jer je takav zadatak) onda napravi public funkcije recimo getBrojnik i getNazivnik koje samo vraćaju odgovarajuću vrednost, i u celom kodu zameni .brojnik sa .getBrojnik() (obrati pažnju na tačku). Analogno i za nazivnika.

Ako ti niko ništa nije rekao u vezi sa tim private (ne piše u zadatku) onda slobodno ih stavi da budu public.
[ Nedeljko @ 24.11.2009. 14:56 ] @
1. Fali ti na vrhu

#include<iostream>

using namespace std;

2. Ti pokušavaš da pritupiš podacima iz klase Razlomak iz funkcija koje su prijateljske za izvedenu klasu MojRazlomak. Njih ne može ni klasa Mrazlomak da vidi, a njene prijateljske funkcije ih ne mogu videti ni ako su u osnovnoj klasi zaštićeni (tada ih vidi izvedena klasa, ali ne i prijatelji izvedene klase). Dakle, operatore sprijatelji sa klasom razlomak.

3. Prijateljska funkcija mora imati isti prototip koji je naveden u deklaraciji sprijateljivanja. Ne može u friend stavci argument da se prenosi po referenci, a u implementaciji po vrednosti. To je druga funkcija.
[ Goran Arandjelovic @ 24.11.2009. 23:31 ] @
Važi i obratna stvar, tj. prijateljstvo se ne nasleđuje. Odnosno, ako su neke f-je prijatelji bazne klase, ne znači da su automatski prijatelji izvedene.
[ ena_m @ 25.11.2009. 19:34 ] @
e hvala na pomoci uspjela sam preko metode getBrojnik i getNazivnik
[ samilen @ 06.12.2009. 11:26 ] @
Prouči i rezervisanu reč friend koja omogućuje da neke određene funkcije, ili cele klase imaju pristup privatnim članicama.