Šta je novo?

C++ static

andonovski

Slavan
Učlanjen(a)
13.01.2005
Poruke
70
Poena
309
Kod:
[FONT="Courier New"]typedef enum {levo, desno} NESTO;

class xxx {
   protected:
      static id;
      NESTO nesto;
   public:
      xxx() {nesto=levo;};
      virtual int getId()const {return id;};
      virtual NESTO getNesto()const {return nesto;};
      virtual void setNesto(NESTO n) {nesto=n;};
};
int xxx::id=0;
//=======================================
class XXX : public xxx {
   private:
       int broj;
   public:
       XXX() {broj=1111;};
       XXX(int a) {broj=a*a-a+1234;};
       int getBroj()const {return broj;}
       void setBroj(int k) {broj=k;};
};
[B]int XXX:id=123;[/B]      //<--- err[/FONT]

[C++ Error] xxx.h(28): E2316 'id' is not a member of 'XXX'

Pitanje 1: da li moram u svakoj klasi, koja nasledi xxx, da pravim poseban staticki atribut ili moze nekako da se definise u virtualnoj klasi pa da ga imam i u svakoj nadledjenoj i kako u tom slucaju da ga inicijalizujem? posto hocu da namestim puno izvedenih klasa i ne bih bas u svakoj da kucam static int id


Pitanje 1.1: da li mogu u header fajlu da inicijalizujem static clan kako sto sam uradio ili bas mora u zasebnom .cpp?
(napomena: probao sam i pise mi "[C++ Warning] gradjevine.h(18): W8058 Cannot create pre-compiled header: initialized data in header", kada prebacim inicijalizaciju u cpp fajl ne buni se)
 
Ako u osnovnoj klasi napravis static int id; onda ce to polje biti dostupno u izvedenim klasama, ako je u protected, odnosno public delu. Ne mozes da ga inicijalizujes u h/hpp fajlu nego u cpp fajlu gde implementiras metode te klase int Klasa::id = 10; na primer.
Static clanovi su zajednicki za sve objekte te klase. Na primer preko static clana mozes da imas uvid u to koliko je trenutno objekata te klase aktivno... tako da nije poenta da u svakoj klasi kucas jedan te isti static clan.
 
static clan mi treba za polimorfnu funkciju koja ce raditi razlicite stvari na osnovu dobijenog id-a.
u prog postoji vise instanci razlicitih klasa koje nasledjuju istu apstraktnu.
npr
Kod:
class Base {
  protected:
    int id;
  public:
    int getId()const {return id;};
};

class Derived1 : public Base {//nebitno
};

class Derived2 : public Base {//nebitno
};

int Base::id=0;
int Derived1::id=1;  //javlja gresku da id nije clan Derived1 :crash: 
int Derived2::id=2;  //mozes pretpostaviti da i ovde isto javlja...:wall: 

void poli(const &Base);

void main{
  Derived1 a;
  Derived2 b;

  poli(a);
  poli(b);
}

void poli(const &Base b){
  switch (nesto){
    case 1 : cout<<"Derived 1."<<endl; break;
    case 2 : cout<<derived 2."<<endl; break;
  }
}

problem mi je sto kad ovako napravim, ne mogu da inicijalizujem id u izvedenim klasama.
kad uradim int Derived1::id=1; izbaci mi gresku da id nije atribut klase Derived1.

krace: ne mogu uopste da inicijalizujem u naslednjeim klasama static clan naslednjen iz osnovne...
 
Poslednja izmena:
Ne mozes da ga inicijalizujes jer je clan private (protected). Nije mu moguce pristupiti izvan klase, znaci ako zelis da mu pristupis napravis get i set metode. Posto je clan static znaci da on ima jednu vrednost za svaku instancu klase. Ako ga promenis u jednoj klasi menja se vrednost i u drugoj klasi.

Resenje 1: Stavi ga u public sekciju. Mozes odmah dati tip objekta. npr. static int parametar;
onda mu pristupas iz bilo koje klase na nacin koji si napisao (ime_klase::parametar)

Resenje 2: Ako ti je potrebno da clan bude protected(private) onda ti ostaju jedino get i set metode.

ako te jos nesto interesuje javni se na PM
 
static clan mi treba za polimorfnu funkciju koja ce raditi razlicite stvari na osnovu dobijenog id-a.
u prog postoji vise instanci razlicitih klasa koje nasledjuju istu apstraktnu.
npr

Deluje mi da si nesto grdno pogresio u koracima. ;)
Taj staticki ID ce ti biti isti za sve instance jedne klase tj. sve ce deliti istu promenljivu i kao sto smark rece to mozes da iskoristis da pratis koliko si instancirao objekata te klase.

A da bi uradio to sto hoces treba da napravis virtuelnu funkciju i onda u svakoj izvedenoj klasi definises tu funkciju. To je inace jedna od osnovnih osobina objektnog programiranja.

http://en.wikipedia.org/wiki/Virtual_function

http://en.wikipedia.org/wiki/Virtual_inheritance
 
Deluje mi da si nesto grdno pogresio u koracima. ;)
Taj staticki ID ce ti biti isti za sve instance jedne klase tj. sve ce deliti istu promenljivu i kao sto smark rece to mozes da iskoristis da pratis koliko si instancirao objekata te klase.

A da bi uradio to sto hoces treba da napravis virtuelnu funkciju i onda u svakoj izvedenoj klasi definises tu funkciju. To je inace jedna od osnovnih osobina objektnog programiranja.

http://en.wikipedia.org/wiki/Virtual_function

http://en.wikipedia.org/wiki/Virtual_inheritance

da, da... u pravu si...
sad mi druga ideja pada na pamet, pa u tom duhu da postavim pitanje (ako ne uspem da implementiram to sto sam naumio)...
 
napravio sam u osnovnoj klasi const char *tip (protected) i u konstruktorima izvedenih klasa je inicijalizovano drugacije za svaku klasu posebno... valjda je to u skladu sa metodologijom oop-a?

Kod:
class ljud {
  protected:
    const char *tip;
  public:
    void opis()const {cout<<tip;};
};

class crnac : public ljud{
  public:
    crnac(){tip="crnac";};
};

class zut : public ljud{
  public:
    zut(){tip="zut";};

jasno mi je da su virtualne klase tu da mogu da se redefinisu u izvedenim, to i koristim u vecini slucajeva, ali sad mi je potrebno da skratim kod time sto necu imati potrebe da redefinisem funkciju, a da mi da razlicit izlaz za razlicite klase, a isti izlaz za razlicite instance iste klase.
da li meni nesto fali ili je to u redu sto pokusavam? :D
 
jasno mi je da su virtualne klase tu da mogu da se redefinisu u izvedenim, to i koristim u vecini slucajeva, ali sad mi je potrebno da skratim kod time sto necu imati potrebe da redefinisem funkciju, a da mi da razlicit izlaz za razlicite klase, a isti izlaz za razlicite instance iste klase.
da li meni nesto fali ili je to u redu sto pokusavam? :D

verovatno si hteo nesto ovako

Kod:
class ljud {
  
  public:
    virtual void opis() const {cout<<"covek"<<endl;};
};

class crnac : public ljud{
  public:
    virtual void opis() const {cout<<"crnac"<<endl;};
};

class zut : public ljud{
  public:
    virtual void opis() const {cout<<"zut"<<endl;};
};

onda to mozes da koristis npr. ovako :
Kod:
ljud *ljudi[3];

ljudi[0] = new ljud;
ljudi[1] = new crnac;
ljudi[2] = new zut;

for(int i = 0; i<sizeof(ljudi)/sizeof(ljud); i++)
{
    ljudi[i]->opis();
}

virtuelne funkcije postoje zato da ti ne bi morao da pravis promeljivu Tip i onda u nekom if/else ili swich-u odlucujes sta da radis. Ovako C++ to radi umesto tebe ;)
 
Klasican polimorfizam, sa tim sto bih dodao da je mozda on hteo da se pojavi neka protected promenljiva u osnovnoj klasi, pa da se u zavisnosti od inicijalizacije pokazivaca na osnovnu klasu pozove odgovarajuci konstruktor izvedene klase koji ce toj promenljivoj dodeliti trazenu vrednost i onda dalje raditi sa tim.
 
@robert
u sustini smo isto napravili samo sto tvoj primer nema protected clan, a kod mene ne mora da se redefinise opis() u svakoj izvedenoj klasi. trenutno meni to tako vise odgovara, da ne redefinisem 100 puta, dok za neke druge funkc u prog mi odgovara tvoj pristup.
@smark
exactly sinjor
 
@robert
u sustini smo isto napravili samo sto tvoj primer nema protected clan, a kod mene ne mora da se redefinise opis() u svakoj izvedenoj klasi. trenutno meni to tako vise odgovara, da ne redefinisem 100 puta, dok za neke druge funkc u prog mi odgovara tvoj pristup.

Dobro sad te mrzi, ali kad posle par godina pogledas svoj kod i upisas se ko je to pisao bice ti jasnije neke stvari.
Ali o tom potom.
 
isitina, jos sam pocetnik i nemam bas neke programe iz sebe, ali ucim, pa dokle doguram :D
hvala na vremenu
 
Nazad
Vrh Dno