Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku

[es] :: C/C++ programiranje :: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku

[ Pregleda: 2884 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku09.06.2009. u 14:43 - pre 181 meseci
Pozdrav svima.

Konkretno imam recimo sledecu strukturu klasa:

class A

class B : public A

class C : public A , znaci iz A izvodim i B i C

Nakon ovoga u niz
A *niz[5]
smestam instance klasa B ili C na osnovu nekih uslova sa niz= new B() ili niz=new C().

Kako da nakon popunjenog niza prodjem kroz niz i proverim da li mi je niz instanca klase B ili C?

Nadam se da nekom strucnjaku odavde ovo nece biti problem.


Hvala unapred.


POZDRAV OD ŽARKA
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku09.06.2009. u 14:58 - pre 181 meseci
Code:
 
#include <typeinfo> 

niz[0]= new B() ; 
niz[1]=new C() ; 
.
.

for (int i=0 i < 5;i++)
 cout << typeid(niz[i]).name() <<endl ; 



Viva lollapalooza
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku09.06.2009. u 15:18 - pre 181 meseci
Pored metoda koji navodi deerbeer, a koji zahteva da uključiš RTTI opciju u projektu, možeš to i ovako:

Code:
A.h
===
class A {
  virtual nekakav_tip getType() = 0; // Ako i objekat klase A može da postoji onda skini ovo "= 0"
};

B.h
===
class B : public A {
  virtual nekakav_tip getType();
};

B.cpp
=====
nekakav_tip B::getType() {
  return nekakva_vrednost_B;
}

To je odgovor na tvoje pitanje. E sad, ako bi ti sad hteo da koristiš ovu funkciju getType() u nekakvom if-u ili switch-u, onda je to pogrešan pristup. Ono što ti u tom slučaju treba je zapravo virtuelna funkcija koja će da odradi ono što bi ti uradio u if-u ili switch-u. Ako ti nije nešto jasno onda reci pa da objasnimo detaljnije.
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku10.06.2009. u 06:43 - pre 181 meseci
Hvala na odgovorima.

Generalno imao sam na umu da uradim nešto kao drugi predlog tj. da napravim virtualne metode i da mi za svaki tip vraća nesto drugačije i na osnovu tog rezultata bi tačno znao o kojoj instanci klase se radi.

Zanimalo me da li postoji nešto ugrađeno u c++ što bi trebalo ovo da mi zadovolji.

Pogledaću malo bolje ovu biblioteku #include <typeinfo> jer je konkretno do sad nisam koristio.
A koristim Visual Studio 6 pa mi je verovatno biblioteka za njega samo sa postfiksom .h tj. <typeinfo.h>

Ovo mi samo nije jasno, šta je to RTTI opcija i čemu služi i kako se uključuje u VS6.

Generalno ja bi da koristim prvi pristup tj. da koristim direktno ono što nudi c++.


Znači samo ako može još neko objašnjenje o RTTI opcijama.
Hvala unapred.
POZDRAV OD ŽARKA
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku10.06.2009. u 08:45 - pre 181 meseci
Evo nešto sam isprobao i nije to to.

Konkretno korišćenjem komande:

Code:
typeid(niz[i]).name()


dobijam podatak da je to klasa A * što i jeste tačno jer u niz smeštam pokazivače na osnovnu klasu (A)
a posle tim pokazivačima dodeljujem koja od izvedenih klasa će da budu tj. da li B ili C sa

Code:
niz[i]=new C()


Na koji način da dobijem konkretno koja od izvedenih klasa se tu nalazi.

Probao sam sa dodavanjem * da bi dobio na šta ukazuje pokazivač:

Code:
typeid(*niz[i]).name())
i dobijem sledeći warning u VS6
'typeid' used on polymorphic type 'class A' with /GR-; unpredictable behavior may result

i po "pokušaju" izvršavanja program puca.

Sad nisam siguran da to nije do nekih opcija koje eventualno ne podržava VS6 jer mislim da je kod ok.
Nisam našao opciju da ukljičim RTTI opciju u VS6 mada prvi kod mi radi tj. dobijam A* kao tip ali ovo drugo neće da radi.
POZDRAV OD ŽARKA
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku10.06.2009. u 08:54 - pre 181 meseci
Evo još jedan dodatak.

Sledeći kod sa neta kod mene ne radi na VS6 tj. dobija se već pomenuti warning i program puca pri izvršavanju.

Code:
#include <iostream>
#include <typeinfo>
using namespace std;
class Mammal {
public:
  virtual bool laysEggs() { 
    return false; 
  }
};
class Cat: public Mammal {
public:
};
class Platypus: public Mammal {
public:
  bool laysEggs() { 
    return true; 
  }
};
int main()
{
  Mammal *p, AnyMammal;
  Cat cat;
  Platypus platypus;
  p = &AnyMammal;
  cout << "p is pointing to an object of type ";
  cout << typeid(*p).name() << endl;
  p = &cat;
  cout << "p is pointing to an object of type ";
  cout << typeid(*p).name() << endl;
  p = &platypus;
  cout << "p is pointing to an object of type ";
  cout << typeid(*p).name() << endl;
  return 0;
}


Kako da ga namestim da radi? To bi verovatno i bilo rešenje mog problema.
POZDRAV OD ŽARKA
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku10.06.2009. u 09:43 - pre 181 meseci
Ne secam se kako ide podesavanje u VC++6
ali bi sigurno trebalo da je u Project properties->C++-> Language->Enable Run-Time Type Info postavi na Yes ..
ili compiler switch je /GR da ukljucis umesto /GR- zato i dobijas runtime gresku .
U novijim verzijama kompajlera za vs2003,2005,2008 je ovo ukljuceno po defaultu .


Viva lollapalooza
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku10.06.2009. u 09:48 - pre 181 meseci
Citat:
Zanimalo me da li postoji nešto ugrađeno u c++ što bi trebalo ovo da mi zadovolji.

Ima, zove se virtuelne funkcije. Ugrađeno u kompajler.

Citat:
Ovo mi samo nije jasno, šta je to RTTI opcija i čemu služi i kako se uključuje u VS6.

Potraži RTTI u helpu, nije sakriveno. http://msdn.microsoft.com/en-us/library/aa236704(VS.60).aspx

Citat:
Generalno ja bi da koristim prvi pristup tj. da koristim direktno ono što nudi c++.

C++ nudi obe varijante, i one se koriste za različite potrebe. Virtuelne funkcije se preporučuju u većini slučajeva, a tek kad moraš onda koristiš typeid. Za male programe od stotinak linija i dve klase zapravo ništa nije bitno, mogao si i u asembleru da ga napraviš, ali kad dođu na red veći programi onda virtuelne funkcije pokazuju fleksibilnost, jednostavnost, i snagu. Bolje se od početka navikavaj na dobro.
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku11.06.2009. u 09:52 - pre 181 meseci
Hvala svima, problem rešen.

Evo konkretno šta treba da se uradi.

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 sam mogao da koristim

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


i da kao izlaz dobijem konkretno o kojoj izvedenoj klasi se radi tj. B ili C.

Hvala još jednom i pozdrav svima.
POZDRAV OD ŽARKA
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.zone5.bethere.co.uk.



+4 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku11.06.2009. u 20:59 - pre 181 meseci
1. string koji dobijes sa name() nije portabilan. Cela ta tvorevina je prilicno beskorisna.

2. Sta fali dynamic_cast-u kad su ti klase vec polimorfne?

3. Ako mozes, bezi daleko od tog VC++6
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 08:08 - pre 181 meseci
Možda da pogledaš i ove teme:
http://www.elitesecurity.org/t299270
http://www.elitesecurity.org/t135457
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 08:47 - pre 181 meseci
Vidim da je definitivno ovaj string koji se dobija sa:
Code:
cout << typeid(*pok[i]).name(); 
tj.

"class B" ili "class C" (u zavisnosti od tipa izvedene klase na koju mi ukazuje pokazivač pok[i ]),

veoma nezgodan za rad jer nisam uspeo da ga poredim ni sa "class B" ili samo "B" i da dobijem potvrdan odgovor da se poklapaju.

Kako to da uradim tj. da poredim vrednost tog stringa sa recimo nazivom izvedene klase(ili nečim drugim) i da dobijem potvrdan odgovor ako se poklapaju.

Za sad, šta god da sam stavio dobio sam da se ne poklapaju.

Problem sam prividno rešio na sledeći način.
Definisao sam pomoćnu instancu izvdene klase B tj.

Code:
B b;


i onda poredio na ovaj način
Code:
if (typeid(*pok[i]) == typeid(b))
            cout<<"Poklapa se\n";


Ovo radi ali me zanima kako da uradim i pomoću poređenja stringova, čisto da vidim kakav je u stvari ovaj string koji daje typeid.

Pozdrav.



[Ovu poruku je menjao X Files dana 12.06.2009. u 10:12 GMT+1]
POZDRAV OD ŽARKA
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 09:50 - pre 181 meseci
C-ovski stringovi (char*) se ne porede pomoću operatora jednakosti (==) nego pomoću C-ovskih funkcija (strcmp, strncmp, stricmp).
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 12:04 - pre 181 meseci
Citat:
NastyBoy
1. string koji dobijes sa name() nije portabilan. Cela ta tvorevina je prilicno beskorisna.
2. Sta fali dynamic_cast-u kad su ti klase vec polimorfne?

http://www.devx.com/tips/Tip/5496
Autor teksta :
http://www.informit.com/author...D6-574C-4C46-8511-101F9F0ED8F8
Viva lollapalooza
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
*.rcub.bg.ac.yu.



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 13:05 - pre 181 meseci
Citat:
Mihajlo Cvetanović: C-ovski stringovi (char*) se ne porede pomoću operatora jednakosti (==) nego pomoću C-ovskih funkcija (strcmp, strncmp, stricmp).


Normalno ali samo je bio problem što za strcmp nisam stavio == 0 jer sam smetnuo sa uma da ako se poklapaju strcmp vraća 0 a ne recimo 1 pa sam stavio

Code:
if(strcmp(typeid(*pok[i]).name(),"class B"))
            cout<<"Poklapa se \n";

bez ==0 pa je ispalo da pitam da li se razlikuju. Sad je ok.

A po ovom komentru izgleda da typeid() ipak ima prednosti u odnosu na kastovanje a po tome ko komentariše ne bi trebali da sumljamo.
POZDRAV OD ŽARKA
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 13:35 - pre 181 meseci
Ubedljivo najgoru moguću grešku koju početnik može da napravi je da favorizuje performanse koda u odnosu na: jednostavnost, razumljivost, fleksibilnost, eleganciju. I to ne govorimo o performansama različitih algoritama, kad se recimo treba odlučiti između quicksorta i flashsorta, ili da li podatke držati u listi ili u vektoru. Govorimo o performansama nekih nebitnih stvari, kao kad neko ne želi da koristi virtuelne funkcije jer su "sporije", ili čak izbegava STL klase i funkcije da se program ne bi linkovao sa msvcpxx.dll bibliotekom. Ili odabere typeid pre nego dynamic_cast ili virtuelne funkcije, jer je typeid "brži". Taktički skroz pogrešno!

Uzgred, kad koristiš typeid onda moraš da uporediš dva stringa. Veliko je pitanje šta je zaista brže, poređenje dva stringa, ili rešenje kompajlera za dynamic_cast.
 
Odgovor na temu

zarkoj
Zarko Jovanovic
Masinski inzenjer / QMS
La Co Me Tecno doo
Kraljevo

Član broj: 193344
Poruke: 1426
79.101.222.*



+11 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku12.06.2009. u 21:31 - pre 181 meseci
Ne favorizujem ja ni jedan metod trenutno ali mi je ovaj nekako jasniji za sad.

Ako možes napiši neki kratak promerčić kao što sam ja naveo sa recimo osnovnom A i dve izvedene klase B i C,
i onda random popuni neki niz recimo od 5 elemenata samo sa instancama izvedenih klasa NPR[B, C, C, B, B]. Normalno niz je po tipu pokazivač na osnovnu klasu.

E i nakon toga uradi proveru da li je niz[3] recimo izvedena klasa 2 ili B kako sam već naveo.


POZDRAV OD ŽARKA
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.zone5.bethere.co.uk.



+4 Profil

icon Re: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku13.06.2009. u 00:13 - pre 181 meseci


Znam ko je Danny, ima odlicne clanke na informit-u. Taj kratak clanak je izvucen iz konteksta - performanse dva pristupa nemaju nikakve posledice ni u ovom ni u vecini drugih slucajeva.
Ali to ne menja moju poentu (a ni poentu onoga sto je Mihajlo napisao) - RTTI, u datom obliku, je beskoristan, ponajmanje zbog slobodne forme vracenog imena klase. Takodje, cast-ovanje te ostavlja i dalje u domenu abstraktnih tipova, dok te rtti primorava da se spustis na gole stringove... rogobatno (srecno ti bilo sa refactoring-om i promenom imena klasa). Za problem u ovom topic-u je dynamic_cast i vise nego dovoljan, obzirom da se radi samo o runtime proveri nad polimorfnim tipovima iz iste hijerarhije i da nije ukljucena serijalizacija/perzistencija bilo kog tipa. Van toga rucno pisani rtti je, iz mog iskustva, bolje resenje nego standardna, na brzinu sklepana, rtti specifikacija samog jezika (uraditi svoj rtti nije tesko, a moze da bude jako zahvalno kada dodje do potrebe za refleksijom, introspekcijom bez kastovanja itd.).

Citat:
kratak promerčić kao što sam ja naveo sa recimo osnovnom A i dve izvedene klase B i C

if ( dynamic_cast<B*>( niz[0] ) ) printf("klasa B");
 
Odgovor na temu

[es] :: C/C++ programiranje :: Provera kojeg je tipa ( recimo od dva moguća ) instanca izvedene klase u c++ jeziku

[ Pregleda: 2884 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.