Wie heißt das instanceof in C++
-
Hi,
eine anfängerfrage..aber ich finde es einfach nicht....leider sind die Mehtodennamen in C++ nicht so richtig intuitiv...
also, ich muß die Klasse eines Objekts zur Laufzeit ermitteln...also sowas wie
if (obj instanceof Foo){
}
Wie war das gleich...mir wills nicht mehr einfallen....erlös mich doch mal einer....
Danke...
-
Da fällt mir auf Anhieb nur "dynamic_cast" ein.
PS: Wozu benötigst du dieses Konstrukt überhaupt? Eventuell kannst du dein Problem ja auch mit einer virtuellen Methode lösen, ohne solche Verrenkungen zu machen.
-
dynamic_cast geht glaub ich, wenn es so implementiert ist, dass es NULL liefert, wenn das Object nicht von dem erwarteten typ ist....danke für den Tip...ich wußte, es war irgendwas mit dynamic...;)
ja klar, ne virtuelle Method wäre möglich...aber ist das nicht eigentlich die Verrenkung, wenn die Programmiersprache bereits Konstrukte für sowas bietet...??
Besten Dank.
-
soweit ich weiss, hat c++ kein instanceof konstrukt. du müsstest dich selbst drum kümmern, dass jede instanz "weiss" von welcher klasse sie eine instanz ist. also der oberklasse ne methode geben, die den typ der klasse zurückgibt.
enum Type { tA, tB, tC, tD }; class A { private: Type t; public: A() : t(tA){} Type getType(); } class B : public A { public: B() : t(tB){} } int main() { A *b = new B; if(b->getType() == tB) { // irgendwas machen } }
aber im grunde ist sowas nicht wirklich nötig. im gegensatz zu z.b. java kannst du auf alle methoden des objekts zugreifen, auch wenn der pointer zur oberklasse gehört.
-
wayneschlegel schrieb:
ja klar, ne virtuelle Method wäre möglich...aber ist das nicht eigentlich die Verrenkung, wenn die Programmiersprache bereits Konstrukte für sowas bietet...??
virtuelle Methoden sind das Standard-Konstrukt in C++, um Objekte abhängig von ihrem Typ unterschiedlich reagieren zu lassen
@bool: Ein "echtes" instanceof hat C tatsächlich nicht, aber dynamic_cast erfüllt ungefähr den selben Zweck. (ich würde es allerdings nur verwenden, wenn ich auf eine neue Methode der abgeleiteten Klasse über einen Basisklassen-Zeiger zugreifen muß)
-
wayneschlegel schrieb:
ja klar, ne virtuelle Method wäre möglich...aber ist das nicht eigentlich die Verrenkung, wenn die Programmiersprache bereits Konstrukte für sowas bietet...??
du siehst das genau falschrum: wieso sich mit dynamic_cast verrenken, wenn man einfach ne methode virtal machen kann?
oder anders:was ist einfacher?
Foo* foo=dynamic_cast<Foo*>(bar); foo->do_sth();
oder
bar->do_sth();
-
CStoll (off) schrieb:
@bool: Ein "echtes" instanceof hat C tatsächlich nicht
Ich mag ja gerade auf dem Schlauch stehen aber erledigt das nicht eigentlich 'typeid' über RTTI? Nicht, dass das in diesem Kontext irgendeinen (mir offensichtlichen) Vorteil über dynamic_cast besäße ..
-
wayneschlegel schrieb:
dynamic_cast geht glaub ich, wenn es so implementiert ist, dass es NULL liefert, wenn das Object nicht von dem erwarteten typ ist....danke für den Tip...ich wußte, es war irgendwas mit dynamic...;)
ja klar, ne virtuelle Method wäre möglich...aber ist das nicht eigentlich die Verrenkung, wenn die Programmiersprache bereits Konstrukte für sowas bietet...??
Besten Dank.
Ich habe so das Gefühl, Du hast CStoll falsch verstanden.
Es geht nicht darum, eine virtuelle Method obj.getType() oder ähnliches zu liefern, sondern darum, ob Du denn wirklich wissen willst, welchen Typ das Objekt hat. Wenn Du eine virtuelle Methode aufrufst, "weiß" das Objekt selbst ohne casten oder rtti o.ä., daß es vom abgeleiteten Typ ist.
In der Regel deutet ein Cast, insbesondere der dynamic_cast, auf einen Konzeptfehler hin. Meistens kommt man ohne Cast aus. Virtuelle Methoden sind häufig die bessere Möglichkeit, typspezifisch zu reagieren.
Tommi