 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
André Schmidt Guest
|
Posted: Mon Apr 05, 2004 8:25 pm Post subject: typecasting - macht nicht was es soll (was ich denke was es |
|
|
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
|
Posted: Mon Apr 05, 2004 10:22 pm Post subject: Re: typecasting - macht nicht was es soll (was ich denke was |
|
|
"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
|
Posted: Tue Apr 06, 2004 6:49 am Post subject: Re: typecasting - macht nicht was es soll (was ich denke was |
|
|
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 , 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
|
Posted: Tue Apr 06, 2004 8:40 pm Post subject: Re: typecasting - macht nicht was es soll (was ich denke was |
|
|
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
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
|
Posted: Wed Apr 07, 2004 1:43 pm Post subject: Re: typecasting - macht nicht was es soll (was ich denke was |
|
|
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 |
|
 |
|
|
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
|
|