 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Steffen Liersch Guest
|
Posted: Fri Nov 21, 2003 11:11 am Post subject: Wie pr374ft man Klassenz... ^ |
|
|
Hallo Leute,
in Delphi prüft man mit Hilfe des "is"-Operators, ob eine beliebige Instanz
einer Klasse von einer bestimmten Klasse abgeleitet ist. Das funktioniert,
weil jede Klasse von TObject abgeleitet ist und daher entsprechende
"static"-Methoden aufweist.
Wie führt man derartige Prüfungen in C++ durch? Ich benutze den C++Builder.
Am liebsten wäre mir eine Lösung, die nicht C++Builder spezifisch ist. Aber
ich vermute, das es diese nicht gibt.
Viele Grüße,
Steffen
--
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é Pönitz Guest
|
Posted: Fri Nov 21, 2003 11:30 am Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? |
|
|
Steffen Liersch <steffen_liersch_pub (AT) gmx (DOT) de> wrote:
| Quote: | Hallo Leute,
in Delphi prüft man mit Hilfe des "is"-Operators, ob eine beliebige Instanz
einer Klasse von einer bestimmten Klasse abgeleitet ist. Das funktioniert,
weil jede Klasse von TObject abgeleitet ist und daher entsprechende
"static"-Methoden aufweist.
Wie führt man derartige Prüfungen in C++ durch? Ich benutze den C++Builder.
Am liebsten wäre mir eine Lösung, die nicht C++Builder spezifisch ist. Aber
ich vermute, das es diese nicht gibt.
|
Suchst Du sowas wie dynamic_cast<>?
Funktioniert natuerlich auch nur bei Objekten, die aus einer
Hierarchie stammen...
Andre'
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Fri Nov 21, 2003 11:32 am Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? |
|
|
Steffen Liersch wrote:
| Quote: | Hallo Leute,
in Delphi prüft man mit Hilfe des "is"-Operators, ob eine beliebige
Instanz einer Klasse von einer bestimmten Klasse abgeleitet ist. Das
funktioniert, weil jede Klasse von TObject abgeleitet ist und daher
entsprechende "static"-Methoden aufweist.
Wie führt man derartige Prüfungen in C++ durch? Ich benutze den
C++Builder. Am liebsten wäre mir eine Lösung, die nicht C++Builder
spezifisch ist. Aber ich vermute, das es diese nicht gibt.
|
Du kannst RTTI nutzen. Entweder:
(man nehme an, derived sei von base abgeleitet)
base* b = was_von_b_abgeleitetes;
derived* d = dynamic_cast<derived*>(b);
if (d)
// ist von der Klasse derived oder einer davon abgeleiteten Klasse
else
// ist was anderes von base abgeleitetes
Statt mit dynamic_cast kann man auch mit typeid arbeiten:
if (typeid(*b) == typeid(derived))
{
// das Objekt ist exakt von der Klasse derived
}
aber sowas wird meist als schlechtes Design angesehen und sollte
möglichst vermieden werden. Statt dessen bau die von der Klasse
abhängige Funktionalität gleich als virtuelle Memberfunktion in die
entsprechende Klasse ein.
--
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 |
|
 |
Albrecht Fritzsche Guest
|
Posted: Fri Nov 21, 2003 11:37 am Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? |
|
|
Steffen Liersch wrote:
| Quote: | Wie führt man derartige Prüfungen in C++ durch? Ich benutze den C++Builder.
Am liebsten wäre mir eine Lösung, die nicht C++Builder spezifisch ist. Aber
ich vermute, das es diese nicht gibt.
|
Doch, gibt es - um von Stroustrups Seite zu zitieren
(www.research.att.com/~bs/bs_faq2.html)
template<class T, class B> struct Derived_from {
static void constraints(T* p) { B* pb = p; }
Derived_from() { void(*p)(T*) = constraints; }
};
Ich dachte, in Boost gibt's noch ein is_a() check, kann das aber nicht
finden.
Ali
--
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: Fri Nov 21, 2003 11:40 am Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? |
|
|
"Steffen Liersch" <steffen_liersch_pub (AT) gmx (DOT) de> schrieb:
| Quote: | in Delphi prüft man mit Hilfe des "is"-Operators, ob eine beliebige Instanz
einer Klasse von einer bestimmten Klasse abgeleitet ist. Das funktioniert,
weil jede Klasse von TObject abgeleitet ist und daher entsprechende
"static"-Methoden aufweist.
Wie führt man derartige Prüfungen in C++ durch?
|
Zur Übersetzungszeit, indem man prüft, ob ein Objekt, Referenz auf ein
Objekt (oder ein Zeiger auf ein Objekt) sich in eine Referenz (oder
einen Zeiger) auf eine Basisklasse "casten" läßt. Falls es nicht geht,
wird der Compiler einen Fehler melden, oder eine andere Funktion aus
einer Gruppe überladener Funktionen wählen usw. Das ist das von Dir
oben beschriebene Szenario (Upcast). Der läßt sich immer zur
Übersetzungszeit auflösen.
Zur Laufzeit (die andere Richtung - Downcast), indem man prüft, ob
sich ein Zeiger auf eine polymorphe Basisklasse in einen Zeiger auf
eine abgeleitete Klasse umwandeln läßt, mittels »dynamic_cast«. Oder
indem man das Ergebnis des Ausdrucks »typeid <objekt-referenz>« mit
bestimmten bekannten »type_info«-Objekten vergleicht.
--
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 |
|
 |
Andreas Goebel Guest
|
Posted: Fri Nov 21, 2003 2:49 pm Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? |
|
|
Steffen Liersch wrote:
| Quote: | Hallo Leute,
in Delphi prüft man mit Hilfe des "is"-Operators, ob eine beliebige Instanz
einer Klasse von einer bestimmten Klasse abgeleitet ist. Das funktioniert,
weil jede Klasse von TObject abgeleitet ist und daher entsprechende
"static"-Methoden aufweist.
Wie führt man derartige Prüfungen in C++ durch? Ich benutze den C++Builder.
Am liebsten wäre mir eine Lösung, die nicht C++Builder spezifisch ist. Aber
ich vermute, das es diese nicht gibt.
Viele Grüße,
Steffen
Ich glaube, das was Du suchst, ist typeid. Angenommen, Dein Objekt ist |
*my_object.
Probier mal
#include<typeinfo>
cout << typeid(*my_object).name();
Du kannst die typeid natürlich auch mit einer if-Anweisung mit einem
bekannten Objekt vergleichtn.
Hinweis: So etwas sollte nur in seltenen Fällen nötig sein!!!
Gruß, Andreas
--
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
|
|