>>155227Ich bin mir nicht ganz sicher, ob ich dein Dings da verstehe. Sieht auf den ersten Blick so aus, als hättest du da im Wesentlichen eine
union
aus beiden Typen gebildet und damit dafür gesorgt, dass beide dasselbe Speicherlayout haben, also im Grunde hast du den Basistyp einfach nur gepadded. Kann man natürlich machen, aber das Problem ist, dass man dann vorab wissen muss, wie groß der größte abgeleitete Typ ist, und dann alle (Arrays aus) Basistypen die maximale Größe haben, also u.U. ziemlich viel verschwendeter Speicher und nicht gerade Cache-effizient (was dir bestimmt furchtbar wichtig ist).
Aus meiner Sicht ist das, was du da machst, wenn ich es richtig verstanden habe, einfach nur unnötig kompliziert. Es löst das eigentliche Problem auch nicht, aber wir bewegen uns langsam in die richtige Richtung: Dein Problem ist, dass du einfach nicht unterscheiden kannst zwischen der abstrakten Repräsentation und der tatsächlichen Allokation der Daten im Speicher. Daher auch meine ursprüngliche Vermutung, dass C oder C++ deine Erstsprache waren, denn dieses Defizit habe ich bei betroffenen Personen schon häufiger beobachtet.
Dein Problem ist weiterhin, dass du bei deinem ursprünglichen Beispiel zwei Dinge vermischt, die einfach nicht zusammengehören:
0. Low-Level-Konstrukte (C-Arrays)
1. High-Level-Konstrukte (C++-Klassen mit Vererbung)
Aus meiner Sicht hast du folgende Wahl:
0. Entweder du nimmst C-Arrays und verzichtest auf C++-Features. Das wäre dann die Low-Level-C-Lösung.
1. Oder du gehst voll C++ und löst das mit Iteratoren und allem Pipapo. Das wäre dann die High-Level-C++-Lösung.
(2. Du bastelst dir selbst etwas, das für deinen speziellen Anwendungsfall passt, siehe unten)
Beide haben ihre Vor- und Nachteile, aber du kannst nicht beides haben. Beides zu vermischen ist tödlich. Das ist in etwa so, als ob du ein C++-Objekt mit dem C++-Operator
new
anlegst und anschließend mit der C-Funktion
free
zerstörst. Es wird dir um die Ohren fliegen.
Ich wollte auch noch mal hierzu etwas sagen, weil es vielleicht falsch rüberkam:
>>154290>Korrekterweise würde man einen Container von Base-Zeigern übergeben würg! und Probleme werden keine gehabt.
>>154893<würg!
>>154893<Lass mich raten: Du hast statt normalen Arrays dann Zeiger-Arrays (oder Container, die dann Zeiger benutzen) genommen?
>>154894>Sowas macht Felix automatisch in solchen Fällen ohne drüber nachzudenken.
Bitte stell dir das jetzt nicht so vor, als ob Felix Code voll wäre von Zeiger-Arrays. Eigentlich hat Felix sowas nie in seinem Code. Das kam hier einfach nur daher, dass dein Beispiel ziemlich konstruiert ist. In der Praxis würde Felix das nie so machen.
Folgende Beobachtungen:
0. Fast immer wenn man über eine Liste/Array von irgendwas iteriert, macht man eine Sache pro Element. Das heißt, man macht sich eine Funktion, die genau einen Zeiger als Parameter hat. Das Iterieren über die Elemente machte man
außerhalb dieser Funktion. Die Funktion braucht gar nicht zu wissen, wie und wo das Element allokiert sind, also ob es z.B. in einem Array allokiert sind oder in einer verketteten Liste, auf dem Heap oder auf dem Stack. Sie braucht auch nicht den genauen Typ zu kennen. Sie bekommt nur den Zeiger.