[ Iznogud @ 15.09.2002. 22:49 ] @
Recimo da postoji seledeca situacija:
Imamo osnovnu klasu osoba i klase student i profesor koje su naslednice klase osoba. Dakle skolski primer.
Treba oformiti zajednicku datoteku u koju ce se upisivati i profesori i studenti i naravno iscitavati iz nje.
Problem je kako vrsiti to citanje odnosno upisivanje.
Da se razumemo, nije problem u kodu nego u samom projektovanju klasa.
Da li je bolje kreiratu posebnu klasu za upis i citanje datoteke (i kako??), ili kreirati posebne metode za citanje i pisanje unutar samih klasa profesor i student ili pak kompletan posao upisa i citanja vrsiti iz glavnog programa ( ovo mi ne izgleda u duhu OOP)?

P.S.Ako neko ima primer klasa sa citanjem i pisanjem datoteku moze mi poslati na mail.


[ Dragi Tata @ 15.09.2002. 23:04 ] @
Moj predlog ti je da preklopiš operatore << i >> za sve tri klase.
[ leka @ 16.09.2002. 02:19 ] @
I moj.
[ Iznogud @ 16.09.2002. 23:14 ] @
OK.
A da li je ovo preklapanje operatora << i >> za klasu student u redu?

ofstream& operator<< (ofstream& out, const student& s) {
out.write((char*)&s,sizeof(s));
return out;
}

ifstream& operator>> (ifstream& in, const student& s) {
in.read((char*)&s,sizeof(s));
return in;
}
[ Dragi Tata @ 16.09.2002. 23:29 ] @
Ne, naopako!!!

Moraš da svaki član klase zapišeš ponaosob uz pomoć operatora << i da posle čitaš svaki član istim redosledom pomoću operatora >>.
[ Iznogud @ 17.09.2002. 10:56 ] @
Citat:

Moraš da svaki član klase zapišeš ponaosob uz pomoć operatora << i da posle čitaš svaki član istim redosledom pomoću operatora >>.

E sad mi tu nesto nije jasno.
Kada ja upisujem sa "out.write((char*)&s,sizeof(s))" tada se u datoteku zapisuje onoliko znakova koliko je s tj sizeof(s) (ako je ime studenta definisano kao char[20] a unesemo ime od 15 zankova i onoh dodatnih 5 ce biti upisano u datoteku i ako to nije deo imena.
Medjutim kada preklopim operator << ovako:
ofstream& operator<< (ofstream& out,const student& s) {
out<<s.ime;
out<<s.datrod;
out<<s.index;
return out;
}
u datoteku se upisije samo onliko znakova imena koliko je i uneto (bez onih dodatnih 5).
Sad mi nije jasno kako preklopiti operator >>. Ovako ne moze:
ifstream& operator>> (ifstream& in,student& s) {
in>>s.ime;
in>>s.datrod;
in>>s.index;
return in;
}
jer otkud prevodilac moze znati kolika je duzina imena (kada je upisano onoliko zankova koliko je uneto.
Gde pravim gresku???
[ Rapaic Rajko @ 18.09.2002. 00:21 ] @
Evo sta treba da radis.
1) Preklopis operatore za sve tri klase, ili kako ja volim da kazem napravis virtuelne metode In i Out u klasi Osoba, a zatim ih override-ujes u klasama Student i Profesor.
2) Pretpostavljam da imas klasu "polimorfni kontejner" (u daljem tekstu Kontejner) za instance klase Osoba. "Polimorfni" znaci da Itemi tog kontejnera mogu biti i instance klase Osoba, kao i instance klase Student i Profesor (jasno, jer to su izvedene klase od klase Osoba). Sve svoje Item-e Kontejner "vidi" kao instance klase Osoba (zato i jeste polimorfni).
3) Prilikom upisivanja u fajl, klasa Kontejner za svaki svoj Item upise jednoznacni identifikator klase tog Item-a (neki integer, ili string - classname; svejedno), zatim kaze tom Item-u da se ispise pozivom Osoba->Out(). Obratite paznju da ce poziv Osoba->Out() izvrsiti: 1) bas Osoba->Out() ili 2) Student->Out() ili 3) Profesor->Out(), u zavisnosti od klase tekuceg Item-a. Postupak se ponavlja dok se svi Item-i ne ispisu.
4) Citanje fajla. Kontejner klasa prvo izvrsi jedan Clear() za brisanje svih svojih postojecih Item-a. Zatim se redom: 1) iz fajla cita identifikator klase Item-a koji sledi; 2) Kontejner kreira odgovarajuci Item prema tom identifikatoru i 3) Kontejner zatim kaze tom Item-u da se procita pozivom metode Osoba->In(). Razume se da ce se izvrsiti prava metoda od sledece tri: Osoba->In(), Student->In() ili Profesor->In(). Zatim se postupak ponavlja do kraja fajla (ili do nekog identifikatora kraja liste; jer to je upravo to: lista).
5) Kraj price.

Rajko
[ Časlav Ilić @ 18.09.2002. 09:36 ] @
Operator >> definiši ovako:

Code:

ofstream&
operator<< (ofstream& out, const student& s)
{
out << s.ime << " ";
out << s.datrod << " ";
out << s.index << " ";
out << endl;
return out;
}


i onda će sve lepo da radi sa operatorom >> kakvim si ga definisao. Ono out << endl; nije neophodno, tu je čisto iz estetskih razloga (dobijaš pregledan fajl).