C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

typecasting - macht nicht was es soll (was ich denke was es

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
André Schmidt
Guest





PostPosted: Mon Apr 05, 2004 8:25 pm    Post subject: typecasting - macht nicht was es soll (was ich denke was es Reply with quote



Hallo,
habe einige von einander abgeleitete klassen. Als da wären:

class CAstroSystemItem
{
int m_nPlanets;
CAstroSystemItem **m_apPlanets; // Array von Pointern
}

class CListObj;
class CAstroPlanet : public CListObj, public CAstroSystemItem

ich möchte nun folgendes machen:

for (int p=0; p<pSystem->m_pSun->m_nPlanets; p++)
{
ConquerMoon((CAstroPlanet*) (&pSystem->m_pSun->m_apPlanets[p]));
}

&pSystem->m_pSun->m_apPlanets[p] liefer mir ein richtiges
CAstroSystemItem-Objekt mit untertyp CAstroPlanet - das kann ich an den
korrekten daten sehen.
Caste ich aber nach (CAstroPlanet*) (&pSystem->m_pSun->m_apPlanets[p])
weil meine ConquerMoon-Funktion diesen Typ erwartet steht nur noch müll
in den Parametern.
Wie mache ich das richtig?

Für jede Hilfe dankbar,
André

--
http://www.szintec.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Mon Apr 05, 2004 10:22 pm    Post subject: Re: typecasting - macht nicht was es soll (was ich denke was Reply with quote



"André Schmidt" <andrescNO (AT) SPAMweb (DOT) de.arcor-ip.de> schrieb:

Quote:
class CAstroSystemItem
{
int m_nPlanets;
CAstroSystemItem **m_apPlanets; // Array von Pointern
}

class CListObj;
class CAstroPlanet : public CListObj, public CAstroSystemItem

ich möchte nun folgendes machen:

for (int p=0; p<pSystem->m_pSun->m_nPlanets; p++)
{
ConquerMoon((CAstroPlanet*) (&pSystem->m_pSun->m_apPlanets[p]));
^

Was soll das »&«?

Benutze in Zukunft an dieser Stelle lieber »dynamic_cast«! Der
Compiler hätte Dir dann den Fehler bereits beim Übersetzen gemeldet.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Tue Apr 06, 2004 6:49 am    Post subject: Re: typecasting - macht nicht was es soll (was ich denke was Reply with quote



On Mon, 05 Apr 2004 22:25:02 +0200, André Schmidt
<andrescNO (AT) SPAMweb (DOT) de.arcor-ip.de> wrote:

Quote:
Hallo,
habe einige von einander abgeleitete klassen. Als da wären:

class CAstroSystemItem
{
int m_nPlanets;
CAstroSystemItem **m_apPlanets; // Array von Pointern
}

class CListObj;
class CAstroPlanet : public CListObj, public CAstroSystemItem

ich möchte nun folgendes machen:

for (int p=0; p<pSystem->m_pSun->m_nPlanets; p++)
{
ConquerMoon((CAstroPlanet*) (&pSystem->m_pSun->m_apPlanets[p]));
}

pSystem->m_pSun->m_apPlanets ist ein CAstroSystemItem**
pSystem->m_pSun->m_apPlanets[m] ist ein CAstroSystemItem*
&pSystem->m_pSun->m_apPlanets[m] ist ein CAstroSystemItem**

Der Brutal-Cast () castet Dir Deinen Zeiger auch auf ein Zeiger auf
ein Toastbrot, wenn Du das sagst.

Quote:
&pSystem->m_pSun->m_apPlanets[p] liefer mir ein richtiges
CAstroSystemItem-Objekt mit untertyp CAstroPlanet - das kann ich an den
korrekten daten sehen.

Kaum

*pSystem->m_pSun->m_apPlanets[p] ist ein CAstroSystemItem-Objekt

Quote:
Caste ich aber nach (CAstroPlanet*) (&pSystem->m_pSun->m_apPlanets[p])
weil meine ConquerMoon-Funktion diesen Typ erwartet steht nur noch müll
in den Parametern.
Wie mache ich das richtig?

Indem Du das schaedliche & weglaesst ;-)

Zum Up- und Downcast zwischen Zeigern auf Objekte einer
Klassenhierarchie ist statt des brutalen ()-Casts der Cast

static_cast<CAstroPlanet*>(pSystem->m_pSun->m_apPlanets[p])

geeigneter. Du erhaeltst bereits beim Compilieren einen Fehler, wenn
Quelle und Ziel nicht zueinander passen - was bei Dir der Fall ist.

Noch groessere Sicherheit bietet Dir bei Upcasts der dynamic_cast, Er
prueft nicht nur statisch zur Compilierzeit, ob die Zeigertypen
zueinander passen (d.h. ob es einen Ableitungspfad zwischen den
Zeigern gibt), sondern er ermittelt auch zur Laufzeit, ob das Objekt,
auf das der Quellzeiger zeigt, wirklich Basis eines Objekts ist, auf
das der Zielzeiger zeigt. Falls nicht, liefert er einen Nullzeiger.
Wenn Du also sicher bist (sicher ist man nie Wink, dass Dein Zeiger
wirklich auf ein Unterobjekt eines CAstroPlanet zeigt, verwende
static_cast. Wenn nicht:

for (int p=0; p<pSystem->m_pSun->m_nPlanets; p++)
{
CAstroPlanet *pCAP = dynamic_cast<CAstroPlanet*>
(pSystem->m_pSun->m_apPlanets[p]);
if (pCAP) ConquerMoon(pCAP);
else /* Error: something fishy happened... */ ;
}

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Schmidt
Guest





PostPosted: Tue Apr 06, 2004 8:40 pm    Post subject: Re: typecasting - macht nicht was es soll (was ich denke was Reply with quote

Warum ich das & dahin gemacht hab weiss der teufel. ist natürlich
quatsch! Vielen dank für die erläuterungen zu static/dynamic_cast - Hab
ich noch nie so richtig gebraucht - bis jetzt Smile
Danke nochmal,
Gruß,
André

--
http://www.szintec.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Frank Birbacher
Guest





PostPosted: Wed Apr 07, 2004 1:43 pm    Post subject: Re: typecasting - macht nicht was es soll (was ich denke was Reply with quote

Hi!

Horst Kraemer wrote:
Quote:
Noch groessere Sicherheit bietet Dir bei Upcasts der dynamic_cast, Er
prueft nicht nur statisch zur Compilierzeit, ob die Zeigertypen
zueinander passen (d.h. ob es einen Ableitungspfad zwischen den
Zeigern gibt), sondern er ermittelt auch zur Laufzeit, ob das Objekt,
auf das der Quellzeiger zeigt, wirklich Basis eines Objekts ist, auf
das der Zielzeiger zeigt. Falls nicht, liefert er einen Nullzeiger.

Falls man mit dynamic_cast referenzen castet, die nicht passes, dann wirft dynamic_cast eine exception bad_cast anstatt NULL zurückzugeben.

Frank

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.