[Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase

Započeo Zepi, 12.06.2009, 10:26

prethodna tema - sledeća tema

Zepi

Monogima bi ovo moglo biti interesantno pogotovu pri izradi seminarskog rada kada recimo iz nekog niza pokazivaca na osnovnu klasu treba da izmu ( ili urade nešto ) sa konkretno jednim tipom instanci.

Imamo osnovnu klasu Osnovna i iz nje izvedene klase Izvedena2 i Izvedena3.
Onda napravimo niz pokazivača na osnovnu klasu Osnovna *pok[10] koji ćemo dinamički popuniti sa istancama ili izvedene2 ili Izvedene3 klase.

Sad ako želite da prođete kroz niz i da uradite nešto samo sa instancema klase recimo Izvedena2 koristi se metoda typeid(instanca) koja vraća tip instance klase.

Da bi mogla ova metoda da se koristi mora se includovati <typeinfo.h> bibioteka.

Ako se koristi VS6 mora ju se uključiti RTTI opcije ručno dok je u novijim veryijama VS-a ovo uključeno po difoltu.

Da bi mogao da se dobije podatak konkretno o kojoj izvedenoj klasi se radi moraju se uključiti RTTI opcije
a bez njih može se dobiti samo podatak o pokazivaču na osnovnu klasu.

Na sledeći način se u VS6 uključuju RTTI opcije:

1. U projektu za koji želite da omogućite RTTI opcije u meniju idete na Project pa Settings
2. Selektujte C/C++ karticu i na njoj u padajućem meniju za kategoriju izaberite C++ Language
3. Čekorajte "Enable Run-Time Type Information (RTTI)"
4. Ponovo izbildujte projekat i sve ce da radi

Nakon ovoga možete da koristite


cout<<typeid(*pok[i]).name();


i da kao izlaz dobijte konkretno o kojoj izvedenoj klasi se radi tj. Izvedena2 ili izvedena3.

Ovako izgleda jedan test programčić koji to i demonstrira.

#include <iostream.h>
#include <typeinfo.h>

class Osnovna{
int atribut1;
public:
Osnovna(){};
void setAtribut1(int a){atribut1=a;};
int getAtribut1()const{return atribut1;};

Osnovna(int a):atribut1(a){};
~Osnovna(){};
virtual void ispis()=0;
};

class Izvedena2:public Osnovna{
int atribut2;
public:
Izvedena2(){};
void setAtribut2(int a){atribut2=a;};
int getAtribut2()const{return atribut2;};

Izvedena2 (int a1, int a2):Osnovna(a1),atribut2(a2){};
~Izvedena2(){};
virtual void ispis(){cout<< this->getAtribut1()+atribut2<<endl;};
};


class Izvedena3:public Osnovna{
int atribut3;
public:
void setAtribut3(int a){atribut3=a;};
int getAtribut3()const{return atribut3;};
Izvedena3 (int a1, int a3):Osnovna(a1),atribut3(a3){};
~Izvedena3 (){};
virtual void ispis(){cout<<this->getAtribut1()+atribut3<<endl;};
};

main(){
int izbor,i;

Osnovna *pok[5];
Izvedena2 iz2;//sluzi zamo za proveru tipa,tj da se sa njom poredi *pok[i]

for (i=0;i<5;i++){
cout<<"Uneti izbor izvedena1:1  ili izvedena2:2 \n";
cin>> izbor;
switch(izbor){
case 1 : pok[i]=new Izvedena2(1,2);break;
case 2 : pok[i]=new Izvedena3(1,3);break;
};

};

for (i=0 ; i < 5 ; i++){
cout << typeid(*pok[i]).name() <<endl ;
cout << typeid(pok[i]).name() <<endl ;

if(typeid(*pok[i]) == typeid(iz2))
cout<<"Poklapa se\n";
cout<<endl;
}
pok[3]->ispis();
return 0;
}


Probajte, korisno je!!!