[ toxi_programer @ 30.08.2006. 09:01 ] @
Imam problem sa deklaracijom frienda klase. U knjizi pise da friend ima pravo pristupa private clanovima klase, a ovo opet nece da radi. Evo o cemu se workuje:
Code:

class str {
public:
friend istream& operator>>(istream &in, str &s);
/* ....... */
};

/* ......*/
istream& operator>>(istream &in, str &s) //ova f-ja treba da bude friend
{
//isprazni s
s.data.clear();

//odvoj razmake sa leva
char zn;
while(in.get(zn) && isspace(zn));

//citaj sve dok ne dodjes na razmak i upisi u S
do s.data.push_back(zn);
while(in.get(zn) && isspace(zn));
in.unget();

return in;
}

Kaze kompajler da ne moze da se pristupi clanu data posto je isti deklarisan kao private podatak.
Pa kako da omogucim pristup?

[Ovu poruku je menjao toxi_programer dana 30.08.2006. u 11:29 GMT+1]
[ itf @ 30.08.2006. 09:48 ] @
Pa jesi ti uopće dodao taj friend u klasi??

friend istream& operator>>(istream &in, str &s);

Ako to ne pali probaj odmah napisati to tijelo u samoj klasi.
[ toxi_programer @ 30.08.2006. 10:29 ] @
Pa jesam deklarisao kao friend:
Code:

class str {
public:
friend istream& operator>>(istream &in, str &s); //evo
/* ....... */
};

i zatim sam definisao f-ju operator>>(bla bla).
Medjutim moram da tu f-ju napisem van tela klase, dakle da f-ja ne bude funkcija clanica klase ali da ima pristup private podacima.
[ itf @ 30.08.2006. 13:42 ] @
Ta friend funkcija i nije članica klase bez obzira napisao ti njeno tijelo unutar klase ili ne. Kad bi bila članica onda ti friend ne bi ni trebao jer samim time što je ta funkcija članica te klase ona odmah ima pristup i svim njenim članovima. Kvalifikator friend se općenito koristi da ti u klasi navedeš kojim vanjskim (uglavnom globalnim) funkcijama klasa dopušta pristup svim svojim članovima.
[ toxi_programer @ 30.08.2006. 16:04 ] @
Pa da znam to. Nego ovako:
Sve radi lepo ako je operator>>(bla) definisan unutar klase( uz kljucnu rec friend u ovom slucaju fja nece biti clanica klase), medjutim ako se definisanje fje izvrsi van tela klase kompajler javlja da je ta fja neodredjena. Ako promenim ime fje, dakle da bude obicna fja a ne fja operatora onda u oba slucaja sve radio ok... ???
[ android~paranoid @ 31.08.2006. 00:15 ] @
Ako operatorska f-ja nije clanica klase onda mora za jedan parametar imati objekat,
mozda da probas da promenis mesta parametrima (referenca str &s da prva bude)
mozda tako mora. Ovako deluje logicno kako si napisao.
[ 1jedini @ 31.08.2006. 10:59 ] @
Sve je u redu.
Koji kompajler koristis, i koju verziju?

GCC 3.4.2 ne prijavljuje nikakvu gresku.

Probaj da pre class str stavis istream& operator>>(istream &in, str &s);

Znaci ovako nesto:

Code:

 istream& operator>>(istream &in, str &s);  //!< forward deklaracija
 class str
 {

  //...
 };


Malko nepotrebno, ali ne skodi.


Ako to ne pomogne, menjaj (verziju) kompajler(a).


Nezaboravi #include <fstream> i #include <string>, pa using namespace std;

Ako si sve to vec stavio onda ti definitivno kompajler ne valja, lose namesten ili mator ...
[ toxi_programer @ 01.09.2006. 10:43 ] @
@1jedini
sve sam potrebne fajlove ukljucio, using namespace std i ostalo je sve ok.
Ovaj primer sa prototipom nisam pokusao da kompajliram ali ce biti greska sigurno jer bi koristio tip STR pre nego sto ga definisem a to ne moze.
@android~paranoid
Koristim VS 6.0. Prvi parametar se odnosi na vrednost levo od operatora, drugi na desnu vrednost. Ja sam hteo da omogucim npr:
str ime;
cin >> ime;
Ako bi im promenio mesta pisalo bi se:
ime >> cin // ili tako nesto....
-----------------------------------------------------------------------------------------------------------
Da, sada mislim da je kompajler u pitanju. Otvorim ja workspace malo pre stavim da se kompajlira program i ne prijavi ni jedan error ni jedan warning, a trebalo bi da bude jedan warning jer main nije vracala vrednost. Iskompajliram ponovo, nista nisam menjao i "cvrc" opet stara prica... Reinstal bi trebalo da pomogne?
[ android~paranoid @ 01.09.2006. 19:19 ] @
Citat:

Da, sada mislim da je kompajler u pitanju. Otvorim ja workspace malo pre stavim da se kompajlira program i ne prijavi ni jedan error ni jedan warning, a trebalo bi da bude jedan warning jer main nije vracala vrednost. Iskompajliram ponovo, nista nisam menjao i "cvrc" opet stara prica... Reinstal bi trebalo da pomogne?


Isto imam VS 6.0, i kod mene ne prijavi ta upozorenja, ali mislim da je to tako i predvidjeno da
prijavi recimo prvi put kad kompajliras a svaki sledeci da ih zanemari.