Objektinformationen in Struktur kapseln
-
Hallo zusammen,
ich bin gerade dabei ein Fenster unter Linux zu programmieren.
Dort hat man eine Struktur "Drawable", die das Fenster
repräsentiert. In der Event-Queue kann man dann bei bestimmten
Events auf das Drawable zugreifen. Jetzt möchte ich auf mein
Fenster-Object zugreifen, in das das Drawable gekapselt ist.
Jetzt habe ich mir überlegt, dass ich eine Struktur mache,
die mir garantiert, dass ein Zeiger auf das Objekt direkt davor
liegt:struct sdrawable{ Window* window; Drawable d; }
In einer Struktur sind doch die Elemente auch in der
Reihenfolge abgespeichert, wie ich sie angebe, oder?
Ist das bei Klassenvariablen genauso?Ich weise in dem Konstruktor dem strukturvar.window = this zu.
Jetzt krieg ich das Drawable in meinem Event.
Die Adressen der Drawables sind identisch.
Jetzt müßte ich doch mitWindow* win = (Window*)*(&drawable-sizeof(Window*));
auf mein Fenster zugreifen können...
Leider stürzt das Programm jetzt ab...Mit dem Drawable kann ich normal arbeiten, deshalb sollte
der Fehler nicht hier liegen.Gruß,
CSpille
-
im prinzip hast du recht, aber
Window* win = (Window*)*(&drawable-sizeof(Window*));
ist totaler murks. erstens ist mir nicht klar warum du sizeof(Window*) abziehst. das muß ja schon nach dem, was du selber bereits geschrieben hast, garnicht sein. außerdem macht die subtraktion nicht das, was du warscheinlich denkst. wenn du von einem zeiger p die zahl n abziehst, dann kommt da &p[-n] raus, also die addresse p-n*sizeof(*p)!!
richtig ist
Window *win=*(Window**)&drawable;
da du aber anscheinend in c++ programmierst solltest du dir überlegen, ob du nicht besser sdrawable von Windows ableitest. allerdings kenn ich mich mit linux nicht so aus und weiß deshalb nicht, ob das in deinem fall auch möglich ist.
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.