dynamic_cast: Wie denn jetzt?!
-
folgende frage: ich habe einen void-zeiger, der auf ein beliebiges objekt zeigt. wie rufe ich den destruktor des objekts auf wenn ich weiss, dass das der typ des objekts von einem anderen typen mit virtuellem destruktor erbt? kann man das irgendwie mit dynamic_cast machen? ich habe leider festgestellt, dass dynamic_cast keine void-zeiger entgegennimmt.
-
Hast du schon static_cast ausprobiert?
-
static_cast funktioniert nicht, da der typ des objektes eine beliebige vererbungsstruktur haben kann. das schliesst mehrfachvererbung und virtual public usw. ein.
-
Warum hasst du denn eine void*? Afaik brauchst du da reinterpret_cast<>, aber void* hat in C++ doch so gut wie keine Verwendung mehr.
Gruß
-
Wie wärs mal wenn du ein _anständiges_ Design erstellst?
-
es ist ein void-zeiger, weil ich zwar weiss, wieviel speicher für ein objekt allokiert werden muss (dass ist immer verschieden), die allokation vom konstruktor-aufruf immer getrennt werden muss. wenn ich nun den speicher via placement new allokiere, kenne ich die adresse des objektes, seinen typen jedoch noch nicht (also gibt es zu diesem zeitpunkt auch noch kein dynamic_cast), da der konstruktor auf der zurückgegebenen adresse ausgeführt wird. nun würde ich kein placement new benutzen, wenn ich diese adresse nicht irgendwo wiederverwenden müsste.
-
das geht nicht so ohne weiteres, jedenfalls musst du dir im prinzip merken, wie ein objekt erstellt wurde, um es zerstören zu können. meine empfehlung hier ist
boost::shared_ptr<void> - der ist gerade auch für solche fälle geschaffen worden, und macht das richtige automagisch.