Herausfinden von welcher Klasse Eigenschaften geerbt wurden
-
Folgendes Problem:
Ich habe eine Instanz einer Klasse und möchte herausfinden ob diese Instanz bestimmte methoden unterstützt. Falls die Instanz dvon einer Klasse erzeugt wurde die in der Klassenhierarchie nach der Klasse X kommt, dann hat sie diese Eigenschaft, ansonsten nicht. Ich weiß aber nicht einmal von welcher Klasse die Instanz selbst ist. Wie kann ich das Problem lösen?
Nochmal etwas genauer:
In einer Klassenhierarchie mit zich Klassen, kann ich nicht alle Klassen durchtesten, sondern muss irgendwie direkt rausfinden ob meine Instanz von KlasseX geerbt hat. Geht sowas?
-
Verstehe nur Bahnhof. Der Compiler meldet dir doch einen error, wenn eine eine Hirarchi eine bestimmte Methode nicht unterstützt.
-
Nochmal...
Nehmen wir mal folgende hierachie an: KlasseA ist die Ursprünglichste Klasse, KlasseZ ist die UrUrUr...Enkelklasse von KlasseA (z-mal abgeleitet)
Stell dir vor du hast eine Variable vom Typ KlasseA. Nennen wir die Variable mal aktuelle Klasse.
Nun hast du eine Function welche dazu da ist verschiedene Ereignisse zu managen. (Nennen wirs Eventhandler)
So...Nun kann es sein, dass gerade das Event "Tastaturereigniss" stattfindet. Als Programmierer weißt du, dass alle Klassen ab KlasseW einen Handler für dieses Ereignis haben, alle vorhergehenden nicht.
Es gilt also jetzt herauszufinden, ob die "aktuelle Klasse" eine Instanz von KlasseW (oder deren Nachfahren) ist, oder nicht. Wenn ja, dann kann man ((KlasseW)aktuelleKlasse).Tastaturhandler aufrufen, ansonsten ignoriert man das ereignis eingfach.Ich hoffe jetzt ist klar geworden was ich will...

-
KlasseW* w = dynamic_cast<KlasseW*>(klasseApointer); if( w) { /// jo wir sind ein w }
-
Und wenn die aktuelleKlasse ein nachfahre von W ist? Geht das dann immer noch?
PS: Wennd er dynamic Cast fehl schlägt, ist w dann in jedem falle NULL? (Auch wenn in w schon was anderes drinnen stand)
-
KFlash schrieb:
Und wenn die aktuelleKlasse ein nachfahre von W ist? Geht das dann immer noch?
PS: Wennd er dynamic Cast fehl schlägt, ist w dann in jedem falle NULL? (Auch wenn in w schon was anderes drinnen stand)
Probier's doch aus:
struct object { virtual ~object() {} }; struct foo : object { }; struct bar : foo { }; struct baz : object { }; int main() { object* o1 = new bar; object* o2 = new baz; std::cout << (dynamic_cast<foo*>(o1)==o1) << '\n' << (dynamic_cast<foo*>(o2)==o2) << std::endl; delete o1; delete o2; }
-
Bin gerade dabei...sieht gut aus...danke euch!

-
KFlash! Das ist aber die falsche Vorgehensweise. Wenn du erst zur Laufzeit einen Objekttyp bestimmen willst/kannst, dann ist das schlechtes Design.
Dein Bsp. mit dem Eventhandler lässt sich doch viel eleganter lösen. Warum lässt du nicht einfach alle Objekte, die die tastatur-Events mitbekommen wollen, sich nicht selbst darum kümmern? Z.B. in dem sich diese bei dem Tastatur-Manager anmelden, und dieser sagt dann den Objekten bescheid, die es nur interessiert. Hat noch den Vorteil, das nur die interessierten Objekte verarbeitet werden. Nach deinem Vorgehen verlierst du Zeit, weil du wahrscheinlich Objekte sinnlos ansprichst, die nie im Leben zum Zug kommen.
Denke dran: casts deuten meistens auf schlechtes Design. Das lässt sich meisten vermeiden, gaaanz selten sollte man darauf zugreifen.
Ob dein Bsp. wirklich dein aktuelles Problem ist, weiß ich nicht. Aber schau dir einfach mal boost::signal an. Damit kann man haargenau dieses Problem lösen, und natürlich auch andere Probleme. (muß nicht zwingend was mit UI zu tun haben)
-
7H3 N4C3R schrieb:
KlasseW* w = dynamic_cast<KlasseW*>(klasseApointer); if( w) { /// jo wir sind ein w }Wirft das nicht std::bad_cast?

MfG SideWinder
-
bad_cast wird bei Referenzen geworfen.