Din categoria "sa aberam la munca"

Aici puteti sta la un pahar de vorba cu ceilalti membri despre orice subiect.
User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Din categoria "sa aberam la munca"

Post by cristianamarie » 09 Mar 2010, 15:56

Ieri am comis inca una. Astazi, porcul rima, da' rima nu porc:

Code: Select all

 _ASSERTE(
      dynamic_cast < Rima * > ( pPorc ) != NULL
   && dynamic_cast < Porc * > ( pRima ) == NULL
);


Nuclear launch detected

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by Ovidiu Cucu » 10 Mar 2010, 00:13

Daca inlocuim pPorc si pRima cu p si, respectiv q se schimba datele problemei? :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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: ).

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Din categoria "sa aberam la munca"

Post by zlatomir » 11 Mar 2010, 13:21

Codul asta:

Code: Select all

_ASSERTE(
   dynamic_cast < Rima * > ( pPorc ) != NULL
   && dynamic_cast < Porc * > ( pRima ) == NULL
);
e cumva echivalent cu:

Code: Select all

_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"...

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Din categoria "sa aberam la munca"

Post by 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:

Code: Select all

#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

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by Ovidiu Cucu » 12 Mar 2010, 08:49

OK, dar daca aberam un pic mai tare...

Code: Select all

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:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by Ovidiu Cucu » 12 Mar 2010, 09:17

Sau, putem abera si mai elegant:

Code: Select all

typedef class Porcorima
{
// ...
   virtual void bagamare() {std::cout << "Eu sint porc dar sint si rima, si ma cheama... Porcorima!"; } 
}Porc, Rima;
:D ;)

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Din categoria "sa aberam la munca"

Post by cristianamarie » 12 Mar 2010, 12:06

Marius Bancila wrote: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

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Din categoria "sa aberam la munca"

Post by zlatomir » 12 Mar 2010, 13:49

Marius Bancila wrote: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)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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:

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Din categoria "sa aberam la munca"

Post by 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)

Post Reply