[ itf @ 13.03.2006. 14:00 ] @
Ja zaista ne mogu shvatiti čemu to služi. Što će mi statička varijabla u klasi, i čemu služe statičke funkcije kao članovi te klase? Može li mi itko na nekakvom primjeru objasniti? Hvala
[ gmail_ @ 13.03.2006. 14:45 ] @
Citat:
itf: Što će mi statička varijabla u klasi




pr:
//Klasa.h
class Klasa{
public:
Klasa(){// konstruktor
broj_Klasa_Objekta ++;
obicana_varijabla++;
}

static int broj_Klasa_objekta; // staticka varijabla

int obicna_varijabla;// obicna

};
// recimo Klasa.cpp moze i u .h ali van tjela klase
// definicija staticke varijable

int Klasa::broj_Klasa_objekta = 1;// postavljanje na vrijdenost 1 ,ako se ne varam po
//defaultu je 0 ali mora biti definirana

//unutar nekog maina:

...
cout << Klasa::broj_Klasa_objekta ; // ispisat ce 1
//primjeti da jos uvjek nemamo instacu klase Klasa

Klasa k1;// instanca klase Klasa
Klasa k2;// instanca klase Klasa
Klasa k3;// instanca klase Klasa

cou << k1.broj_Klasa_objekta ; // ispisat ce 2
cou << k2.broj_Klasa_objekta ; // ispisat ce 3
cou << k3.broj_Klasa_objekta ; // ispisat ce 4

//recimo da je pocetna vrijednost varijable obicna_varijabla = 0
//makar ce u ovom slucaju biti u njoj smece jer ju nismo definirali
// ali teoretski uvjek ce ispisati 1
cou << k1.obicna_varijabla ; // ispisat ce 1
cou << k2.obicna_varijabla ; // ispisat ce 1
cou << k3.obicna_varijabla ; // ispisat ce 1
...

ZAKLJUCAK:

staticka varijabla je djeljena izmedju svih objekta istog tipa
i za nju se alocira prostor samo jednom i to prije nego se instancira klasa(u ovom slucaju prije nego se uslo u main)
( znaci laicki postoji samo jedna varijabla " broj_Klasa_objekta" bez obzira bilo 5 instanci klase Klasa ili nijedna)

za funkcije ti je slicno:

staticke funkcije su one funkcije koje mogu pristupiti samo statickim memberima klase


uh al sam ga zakomplicirao ali nadam se da je bar malo pomoglo

[Ovu poruku je menjao gmail_ dana 13.03.2006. u 15:46 GMT+1]
[ X Files @ 13.03.2006. 14:58 ] @
Zamisli da tvoja klasa u sebi sadrži neki VELIKI BINARNI PODATAK, ka na primer neku
BITMAP-u od 2MB (Recimo sliku nečega).

Zamisli šta bi se desilo da kreiraš 200 objekata te klase, a slika je naravno ista...

static prosto kaze da je jedan primerak dovoljan.

A evo ti i primer jednog vrhunskog programera radi slicnog problema:

Citat:

One more example. Once I created an imaging application, and the Image
class had a 50k lookup table (precalculated data) to speed up some
internal calculations. I accidentally made that lookup table a regular
member, when it should have been a static member (the same
pre-calculated data could have been shared by all instances). My mistake
was not a traditional leak, because the memory was always deallocated,
but I wasted unnecessarily too much memory. After having a hundred
instances of that object, it became overwhelming, and I eventually got a
memory leak complaint from the customer. No memory leak detector could
find anything, while it was clear that the more objects I had, the
available memory was decreasing rapidly, and after a careful look at the
code, I spotted the "cockroach". It was one very hard to find problem.



[Ovu poruku je menjao X Files dana 13.03.2006. u 15:59 GMT+1]
[ itf @ 13.03.2006. 15:29 ] @
Sad kužim... Hvala
[ Dragi Tata @ 13.03.2006. 16:20 ] @
Citat:
X Files: Zamisli da tvoja klasa u sebi sadrži neki VELIKI BINARNI PODATAK, ka na primer neku
BITMAP-u od 2MB (Recimo sliku nečega).

Zamisli šta bi se desilo da kreiraš 200 objekata te klase, a slika je naravno ista...



Ovo je loš primer. Ako objekat sadrži veliki binarni podatak, kreiraj ga samo jednom i prosleđuj pointere ili reference na njega gde treba.
[ Goran Arandjelovic @ 13.03.2006. 19:24 ] @
@itf
Npr. tako implementiraš reference counting u nekoj klasi...