Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Altele » Intrebare simpla C++




Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 23 Sep 2008 15:21:32    Subiect: Intrebare simpla C++
Rimio info:

Rimio:

Cum determin daca un obiect stocat in BaseClass* este sau nu ChildClass, fara mijloace interne (un camp initializat cu o valoare specifica in constructorul lui ChildClass)?

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 
    Postat la 23 Sep 2008 16:38:06    Subiect: Re: Intrebare simpla C++
Deliverance info:

Deliverance:

Rimio a scris:

Cum determin daca un obiect stocat in BaseClass* este sau nu ChildClass, fara mijloace interne (un camp initializat cu o valoare specifica in constructorul lui ChildClass)?


Cred ca dynamic_cast e solutia care iti trebuie

http://www.cprogramming.com/reference/typecasting/dynamiccast.html


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 23 Sep 2008 16:58:57    Subiect: < fara subiect >
Dark info:

Dark:

Dupa cum am discutat si pe Yahoo, dynamic_cast e fix solutia care NU iti trebuie. In general RTTI-ul este incet cind lasi compilatorul sa-l faca, deoarece C++ permite ierarhii extrem de complicate, deci compilatorul trebuie sa se dea peste cap sa suporte toate cazurile. O scurta dezasamblare a codului generat de VC 2005 pentru dynamic_cast ne arata ca, pentru cazul banal in care clasele sint inrudite si ierarhia e liniara, se ruleaza aproape 200 de instructiuni, se apeleaza citeva functii si se fac vreo 6 accese la memorie (si toate sint cache miss-uri, probabil). Pentru cazurile mai complicate cu mostenire multipla sau virtuala sau alte timpenii se executa probabil niste mii de instructiuni (n-am mai avut rabdare sa numar).

In plus, dynamic_cast mai are citeva feature-uri minunate. Unul ar fi ca in viltoarea OOP-ului te poti trezi ca-l folosesti pe referinte. Evident, pentru referinte nu mai are cum sa returneze 0 cind clasele nu-s inrudite, asa ca va arunca o exceptie, lucru cu care te califici intr-o noua liga a campionatului de cod care n-are ce cauta in jocuri. Alt feature este:

Cod sursă:

class Base {};
class Child : public Base {};
class GrandChild : public Child {};
Base* b = new GrandChild;
Child* c = dynamic_cast((Child*))b; // paranteze duble in loc de mai mic mai mare, multumim softului paranoic de forum
if(c) { printf("c este Child"); }
 


Codul asta se va jura ca "c este Child", ceea ce e adevarat. Problema e cind vrei sa determini relatia stricta, ca atunci dynamic_cast nu mai are cum sa te ajute.

Solutia este, evident, sa bagi o functie virtuala care sa-ti returneze un int ce identifica clasa. Este mai simplu si MULT mai eficient. Nu exista scuze pentru folosirea lui dynamic_cast pentru RTTI, asta e genul de cod care te face sa pici interviuri la firmele de jocuri (sau ar trebui sa fie). dynamic_cast e obligatoriu cind faci cast-uri in ierarhii tembele cu mostenire virtuala, dar in general nu exista scuze nici pentru a folosi mostenirea virtuala.

Ultima editare efectuată de Dark pe 23 Sep 2008 17:00:53; 2 editări în total

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 23 Sep 2008 18:28:38    Subiect: Re:
Deliverance info:

Deliverance:

Dark a scris:

Dupa cum am discutat si pe Yahoo, dynamic_cast e fix solutia care NU iti trebuie. In general RTTI-ul este incet cind lasi compilatorul sa-l faca, deoarece C++ permite ierarhii extrem de complicate, deci compilatorul trebuie sa se dea peste cap sa suporte toate cazurile. O scurta dezasamblare a codului generat de VC 2005 pentru dynamic_cast ne arata ca, pentru cazul banal in care clasele sint inrudite si ierarhia e liniara, se ruleaza aproape 200 de instructiuni, se apeleaza citeva functii si se fac vreo 6 accese la memorie (si toate sint cache miss-uri, probabil). Pentru cazurile mai complicate cu mostenire multipla sau virtuala sau alte timpenii se executa probabil niste mii de instructiuni (n-am mai avut rabdare sa numar).

In plus, dynamic_cast mai are citeva feature-uri minunate. Unul ar fi ca in viltoarea OOP-ului te poti trezi ca-l folosesti pe referinte. Evident, pentru referinte nu mai are cum sa returneze 0 cind clasele nu-s inrudite, asa ca va arunca o exceptie, lucru cu care te califici intr-o noua liga a campionatului de cod care n-are ce cauta in jocuri. Alt feature este:

Cod sursă:

class Base {};
class Child : public Base {};
class GrandChild : public Child {};
Base* b = new GrandChild;
Child* c = dynamic_cast((Child*))b; // paranteze duble in loc de mai mic mai mare, multumim softului paranoic de forum
if(c) { printf("c este Child"); }
 


Codul asta se va jura ca "c este Child", ceea ce e adevarat. Problema e cind vrei sa determini relatia stricta, ca atunci dynamic_cast nu mai are cum sa te ajute.

Solutia este, evident, sa bagi o functie virtuala care sa-ti returneze un int ce identifica clasa. Este mai simplu si MULT mai eficient. Nu exista scuze pentru folosirea lui dynamic_cast pentru RTTI, asta e genul de cod care te face sa pici interviuri la firmele de jocuri (sau ar trebui sa fie). dynamic_cast e obligatoriu cind faci cast-uri in ierarhii tembele cu mostenire virtuala, dar in general nu exista scuze nici pentru a folosi mostenirea virtuala.


De acord.


Status:
Înregistrat pe:
13 Oct 2006 10:05:37
Vârsta: 25 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator

 
    Postat la 23 Sep 2008 20:07:20    Subiect: < fara subiect >
Rimio info:

Rimio:

Mersi mult Dark, again Very Happy.

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 800
Locatie: Pitesti, Arges
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 06:53:55 24.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved