Din categoria "sa aberam la munca"

Aici puteti sta la un pahar de vorba cu ceilalti membri despre orice subiect.

Din categoria "sa aberam la munca"

Mesajde cristianamarie » 09 Mar 2010, 15:56

Ieri am comis inca una. Astazi, porcul rima, da' rima nu porc:
Cod: Selectaţi tot
_ASSERTE(
      dynamic_cast < Rima * > ( pPorc ) != NULL
   && dynamic_cast < Porc * > ( pRima ) == NULL
);
Nuclear launch detected
Avatar utilizator
cristianamarie
Membru++
Membru++
 
Mesaje: 292
Membru din: 12 Mar 2009, 18:47
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 10 Mar 2010, 00:13

Daca inlocuim pPorc si pRima cu p si, respectiv q se schimba datele problemei? :)
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 11 Mar 2010, 00:04

Cristi, am intrebat pentru ca, la prima vedere, exemplul de mai sus spune mai mult "râma porc, da' porcu' nu râmă" (sa ma ierte Domnul Darwin! :biggrin: ).
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde zlatomir » 11 Mar 2010, 13:21

Codul asta:
Cod: Selectaţi tot
_ASSERTE(
   dynamic_cast < Rima * > ( pPorc ) != NULL
   && dynamic_cast < Porc * > ( pRima ) == NULL
);

e cumva echivalent cu:
Cod: Selectaţi tot
_ASSERTE(false);

:? ca eu nu prea vad cum ar putea evalua "true" expresia din paranteza (dynamic_cast ori reuseste ambele cast-uri, ori niciunul, nu are cum sa fie numai unul NULL) asta e aberatia?
V-as ruga sa detaliati putin "aberatia de la munca", pentru cei mai "necunoscatori"...
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Din categoria "sa aberam la munca"

Mesajde cristianamarie » 11 Mar 2010, 20:24

Nu. E din categoria "cind n-ai chef de munca, iata ce poti scoate pe goarna", nu era vreun exemplu de cod...

Dar daca totusi lasi glumitza la o parte si te concentrezi pe "cod", uite si un exemplu:
Cod: Selectaţi tot
#include "stdafx.h"
#include <iostream>
#include <crtdbg.h>

class Rima {
public:
   Rima()
   {}
   virtual void bagamare() { std::cout << "rima" << std::endl; }
};

class Porc : public Rima {
public:
   Porc()
   {}
   virtual void bagamare() { std::cout << "porc" << std::endl; }
};


int _tmain(int argc, _TCHAR* argv[])
{
   Rima* pRima = new Rima;
   Porc* pPorc = new Porc;

   Rima* pPorcuRima = dynamic_cast < Rima * > ( pPorc );
   bool porcu_rima  = pPorcuRima != NULL;

   Porc* pRimaPorc = dynamic_cast < Porc * > ( pRima );
   bool rima_nu_porc = pRimaPorc == NULL;

   _ASSERTE(
         porcu_rima
      && rima_nu_porc
   );

   delete pPorc;
   delete pRima;

   return 0;
}


Porcu e derivat din Rima, deci dynamic_cast < Rima * > ( pPorc ) merge (!= NULL).
Rima nu e derivata din Porc, deci dynamic_cast < Porc * > ( pRima ) nu merge (NULL).
De unde si assert-ul.
Nuclear launch detected
Avatar utilizator
cristianamarie
Membru++
Membru++
 
Mesaje: 292
Membru din: 12 Mar 2009, 18:47
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde zlatomir » 11 Mar 2010, 21:18

Multumesc pentru lamuriri, am confundat eu cast-urile (ma rog defapt, e logic, dynamic_cast sa faca verificare la run-time sa vada daca Clasa_Baza * e defapt new Clasa_Derivata si abia apoi sa poata face cast-ul), adevarul e ca nu am exersat cast-urile prea mult :oops: , multumesc pentru lamuriri
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 12 Mar 2010, 08:49

OK, dar daca aberam un pic mai tare...
Cod: Selectaţi tot
class Rima
{
//...
   virtual void bagamare() { std::cout << "Sint doar o biata rima dar nu ma enervati! Pot fi si porc."; }
};

typedef Rima Porc;

...atunci si porcu' rima si rima porc... :biggrin:
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 12 Mar 2010, 09:17

Sau, putem abera si mai elegant:
Cod: Selectaţi tot
typedef class Porcorima
{
// ...
   virtual void bagamare() {std::cout << "Eu sint porc dar sint si rima, si ma cheama... Porcorima!"; }
}Porc, Rima;

:D ;)
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde Marius Bancila » 12 Mar 2010, 10:27

Porcorima asta pare sa fie urmatoare inventie monumentala dupa strutocamila lui Dimitrie Cantemir. Si tot din Moldova vine. ;)

PS: sper ca s-a inteles gluma... 8-)
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1778
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Din categoria "sa aberam la munca"

Mesajde cristianamarie » 12 Mar 2010, 12:06

Marius Bancila scrie:Porcorima asta pare sa fie urmatoare inventie monumentala dupa strutocamila lui Dimitrie Cantemir. Si tot din Moldova vine. ;)

PS: sper ca s-a inteles gluma... 8-)

Pai de unde altundeva? Folosesc la ceva si anii petrecuti la CUI, Consart si Casa Armatei *

* pentru cine nu stie, locasuri de tras pe gitlej si aberat dupa un numar de vodci si beri la care se aplica proprietatea Darboux:
"intre oricare doua rachiuri, mai e loc de inca unul" :D
Nuclear launch detected
Avatar utilizator
cristianamarie
Membru++
Membru++
 
Mesaje: 292
Membru din: 12 Mar 2009, 18:47
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde zlatomir » 12 Mar 2010, 13:49

Marius Bancila scrie:Porcorima asta pare sa fie urmatoare inventie monumentala dupa strutocamila lui Dimitrie Cantemir. Si tot din Moldova vine. ;)

PS: sper ca s-a inteles gluma... 8-)


Foarte probabil sa fie o inventie monumentala... totul depinde de cum se comporta struto-camila ;), ca daca era un strut cu doua cocoase nu cred ca ar fi folosit la careva, dar in schimb o camila cu aripi = Concorde al zilelor noastre... ohhh sh##... strutul nu zboara... deci nici strutocamila... nici concorde... :? de aici sa li se traga problema, au folosit "multiple inheritance" intre un F22 si un Boeing? oare??? ca totusi alea zboara amandoua sau a fost combinatie intre strut si camila :?

Haideti totusi sa folosim alte "animale" pt aberatii, ca stim cu totii: oamenii OOP adora animalele si se poate confunda codul "aberant" cu rubrica "asa nu", eu cel putin asa am crezut initial (confundand casturile am crezut ca e prost scris codul)
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 14 Mar 2010, 10:19

Daca n-ar exista strutocamile in C++ n-ar mai fi nevoie de dynamic_cast si de RTTI, in general.
:ugeek: Cred c-ar trebui sa continui "Verificarea tipului la runtime". :D
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde zlatomir » 14 Mar 2010, 11:34

Ovidiu am citit articolul acela, e interesant, multumesc, era doar o "mica" amnezie a mea despre cast-uri, am confundat dynamic_cast cu static_cast, care intoarce true in ambele cazuri si atunci pe moment am crezut ca si static_cast intoarce pointer NULL daca nu sunt clasele in ierarhie (FALS)

M-am prins la prima explicatie a lui Cristian care era baiu' si ziceam si mai sus intr-un comentariu numele dynamic "spune" ca e cu verificare la run-time (verifica daca Baza* ptr = new Derivat si doar atunci merge dynamic_cast de la Baza la Derivat, e logic)

Oricum recomand articolul :thumbsup:
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Din categoria "sa aberam la munca"

Mesajde Ovidiu Cucu » 14 Mar 2010, 12:02

Sa vezi ce naspa e atunci cand ai de-a face cu design facut sub influenta LSDA (*) iar pentru developeri, prafurile gen RTTI sunt interzise de lege... :wacko:

___________________________________________
(*) LSDA = LSD for Architects, aka Design Patterns. :biggrin:
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2220
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Din categoria "sa aberam la munca"

Mesajde zlatomir » 14 Mar 2010, 13:13

Ovidiu, deocamdata nu am ocazia sa vad... si cum multe firme vor junior developer cu MINIM 2 ani experienta... nici nu cred ca o sa vad prea curand ;) (minim cu majuscule nu am scris eu asa "la misto" efectiv am vazut astfel de anunt)
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Următorul

Înapoi la Discutii

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator