Objekt Typ ermitteln
-
Hallo,
ist es möglich den Typen eines Objektes zu ermitteln?
Also ich speichere verschieden Objekte in einer Array ab. Die Array besteht aus einer Superklass, sodass ich verschiedene Objekt typen abspeichern kann.Nun möchte ich wissen ob array[0] zum Beispiel von Typ A ist. Ist das möglich?
Mfg, Martek
-
schau dir mal hier
http://www.cplusplus.com/doc/tutorial/typecasting/den Abschnitt über typeid an ... gaaaaaaaaaaaanz unten
vielleicht ist das ja was.
-
martek schrieb:
...Also ich speichere verschieden Objekte in einer Array ab. ...
Macht man nicht (in C++) - kommst Du von Java?

In C++ versucht man, möglichst viel "Wissen" in den Datentyp zu packen und dem Compiler möglichst viel Arbeit zu überlassen.
Wenn man Dinge in einen Container (z.B. Array, vector, list, ...) packt, dann wegen ihrer Gemeinsamkeiten und die Unterschiedlichkeit packt man in virtuelle Funktionen.Dieses Vorgehen ist nicht nur lustige Konvention sondern hat sich über längere Zeit und verschiedenste Projekt(größ)e(n) bewährt - und es ist sogar einfacher.

martek schrieb:
...Die Array besteht aus einer Superklass, sodass ich verschiedene Objekt typen abspeichern kann....
Oh Oh
da wittere ich den bösen alten Slicing-Puma hinter dem Busch ...
Ein "Array" (falls es sich um ein C++-Array und nicht irgendeine Klasse handelt) hat erstmal nichts mit "Speicherbarkeit" zu tun - und verschiedene Klassen bekommst Du da nicht wirklich (verlustfrei) rein.Gruß,
Simon2.
-
martek schrieb:
ist es möglich den Typen eines Objektes zu ermitteln?
Ja, aber in den meisten Fällen ist es ein Designfehler, wenn du den Typ explizit ermitteln musst.
Ich nehme an, du willst sowas:
Base* a = /* ... */; if (/*a ist vom Typ Derived1 */) // führe Derived1-spezifische Aktionen durch else if (/*a ist vom Typ Derived2 */) // führe Derived2-spezifische Aktionen durchDabei sind virtuelle Funktionen und dynamische Polymorphie aber das bessere Vorgehen. Dann hast du nämlich nur noch sowas, wobei die Klassen
Derived1undDerived2ihr Verhalten selbst implementieren:a->TueEtwas();Übrigens: Tu dir doch keine Arrays an. In C++ gibt es Containerklassen wie
std::vector, die viel komfortabler sind. Selbst für statische, gleich gross bleibende Arrays kannst dustd::tr1::arrayverwenden.
-
Nun möchte ich wissen ob array[0] zum Beispiel von Typ A ist. Ist das möglich?
Benutze
dynamic_cast!
-
Man kann auch das Visitor Pattern anwenden.
Vorher sollte man aber nochmal gründlich sein Design überdenken.