Cast von Member-Pointer zu Klassen-Pointer
-
Hallo erstmal

Die Funktion void gibI(Birne* b) braucht den Pointer zu class A um Variable i auszulesen.
Vererbung kann ich aus Gründen nicht benutzen.
Wie cast ich das richtig?So siehts aus:
class Birne { public: int garbage [1000]; }; class A { public: short i; Birne b; }; void gibI(Birne* b) { A* ptr = static_cast<A*>(b); // wie cast ich das richtig? cout() << ptr->i; } int main() { A a; a.i = 100; gibI(&a.b); return 0; }Hilfe

-
So direkt ist das gar nicht zu casten. Dein b ist schließlich kein Zeiger auf das A, sondern auf einen Teil des A. Da musst du dir mit offsetof oder ähnlichem selber ausrechnen, wie der Zeiger zuerst umgebogen werden muss, und dann kannst du ihn hinterher auf den richtigen Typ casten (reinterpret_cast). Und vorher zum Rechnen natürlich auch casten, halt auch char* oder ähnliches.
Bist du wirklich sicher, dass das Vorgehen eine gute Idee ist? Vielleicht ist dir ja bloß nicht bewusst, dass es eine bessere Lösung gibt, für was auch immer du vor hast.
-
offsetof ist die Lösung, keine hübsche aber funktioniert, danke dafür

SeppJ schrieb:
Bist du wirklich sicher, dass das Vorgehen eine gute Idee ist?
Nein

SeppJ schrieb:
Vielleicht ist dir ja bloß nicht bewusst, dass es eine bessere Lösung gibt, für was auch immer du vor hast.
Kann schon sein

Ich brauch das für nen Memory Manager.
Ich muss bei der free(T* ptr) Funktion mich vom Object Pointer, zum Pool Object und dann weiter zum Memory Pool durchhangeln.
Da fiel mir erstmal nix anderes ein.Ich hatte erst mit -sizeof(int) versucht zum Anfang der Klasse zu kommen aber das klappte nicht, weil sizeof(int) = 4 ist, aber der Compiler
meint 8 Byte reservieren zu müssen (was mir offsetof jetzt gezeigt hat)