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 

Wie pr374ft man Klassenz... ^

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





PostPosted: Fri Nov 21, 2003 11:11 am    Post subject: Wie pr374ft man Klassenz... ^ Reply with 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

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





PostPosted: Fri Nov 21, 2003 11:30 am    Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? Reply with quote



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





PostPosted: Fri Nov 21, 2003 11:32 am    Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? Reply with quote



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





PostPosted: Fri Nov 21, 2003 11:37 am    Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? Reply with quote

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





PostPosted: Fri Nov 21, 2003 11:40 am    Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? Reply with quote

"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





PostPosted: Fri Nov 21, 2003 2:49 pm    Post subject: Re: Wie prüft man Klassenzugehörigkeit am besten? Reply with quote

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