typeid der child klasse
-
Hallo Leute,
mein Problem ist ich habe eine Liste vom mit Zeigern vom Basetyp und möchte nun wissen von welchem Childtyp das Objekt ist. Nun weiss ich nicht genau wie ich den Typ rauskriege, den typeid() gibt mir nur den Basetyp zurück also die des Zeigers aber nicht des Objektes auf das er zeigt. Ich habe auch versucht den typ durch einen cast heruaszubekommen aber scheinbar kann ich nicht down casten?
hier etwas Beispiel code um mein Problem besser zu beschreiben
class base{ void function() }; class foo: base{ }; class bar: base{ };int main(int,int**){ vector<base*> list; foo *f = new foo(); bar *b = new bar(); list.push_back(f); list.push_back(b); for(i != list.end();i){ i->update(); if(typeid(foo)== typeid(*i))do_foo_stuff(); if(typeid(bar)== typeid(*i))do_bar_stuff(); } }gruss o.g.wrapper
-
dir fehlt ein virtueller destruktor in der basisklasse. (im prinzip reicht irgendeine virtuelle funktion, aber wenn du mit polymorphie arbeitest solltest du sowieso *immer* einen virtuellen destruktor haben)
ohne virtuelle funktion bekommst du mit RTTI nur den statischen typ (also base&).btw: immer
<typeinfo>inkludieren, wenn du mittypeidarbeitest.
-
Also ich habe bei der base klasse den destruktor virtual gesetzt und bekomme immer noch die selben wert von typeid.
-
Ich hab mir den aufruf der destructoren dann mal ausgeben lassen und dabei bemerkt das der destructor nicht automatisch von vector<T>.clear() aufgerufen wird. Also rufe ich ihn jetzt haendig auf und dann werden auch beide destruktoren aufgerufen. Ich nutze den gcc version 4.3
-
O.G.Wrapper schrieb:
Ich hab mir den aufruf der destructoren dann mal ausgeben lassen und dabei bemerkt das der destructor nicht automatisch von vector<T>.clear() aufgerufen wird. Also rufe ich ihn jetzt haendig auf und dann werden auch beide destruktoren aufgerufen. Ich nutze den gcc version 4.3
vector<T>::clearruft sehr wohl die destruktoren auf, allerdings natürlich denT::~T-destruktor. wennTein zeiger ist, dann wird der also "destruktor" für den zeiger aufgerufen, aber nicht der destruktor für das objekt, auf das er zeigt.im übrigen war das auch dein ursprünglicher fehler (neben dem fehlen von
virtual):if (typeid (**i) == typeid(foo))zweimal dereferenzieren, denn
*igibt dir ja nur einen zeiger auf base zurück.
-
danke funktioniert jetzt
-
O.G.Wrapper schrieb:
Hallo Leute,
mein Problem ist ich habe eine Liste vom mit Zeigern vom Basetyp und möchte nun wissen von welchem Childtyp das Objekt ist. Nun weiss ich nicht genau wie ich den Typ rauskriege, den typeid() gibt mir nur den Basetyp zurück also die des Zeigers aber nicht des Objektes auf das er zeigt. Ich habe auch versucht den typ durch einen cast heruaszubekommen aber scheinbar kann ich nicht down casten?
hier etwas Beispiel code um mein Problem besser zu beschreiben
class base{ void function() }; class foo: base{ }; class bar: base{ };int main(int,int**){ vector<base*> list; foo *f = new foo(); bar *b = new bar(); list.push_back(f); list.push_back(b); for(i != list.end();i){ i->update(); if(typeid(foo)== typeid(*i))do_foo_stuff(); if(typeid(bar)== typeid(*i))do_bar_stuff(); } }gruss o.g.wrapper
Das sieht nach einem Design-Fehler aus. Wenn man mehr die Hintergründe kennen würde, könnte man vllt das Problem umgehen und wohlmöglich sowas draus basteln:
for(i != list.end();i){ i->update(); i->do_stuff(); // do_struff -> virtual }