WndProc Problem: Aufruf von Klassenmembern bzw Pointern
-
Hallo,
ich habe das folgende Problem:
ich erstelle ein Fenster (aus einer anderen Klasse) und gebe da eine statische Memberfunktion an, welche auf eine Nichtstatische weiterleitet (WndProc).
Das klappt alles.Wenn ich jetzt aus der WndProc (s.o.) auf einen Pointer (der Klasse) zugreife (ich habe alles in public), z.b.
engine (mit engine->test() ) dann ging das bis vor kurzem nicht (habe rumgespielt, jetzt geht das.)jetzt klappt aber immer noch nicht:
engine->fenster->Test()als Fehlermeldung erhalte ich :
Zugriffsverletzung beim Lesen an Position 0xcccccccc
,welche immer gleich ist (was liegt denn an der Speicherpos?)Wenn ich stattdessen :
engine->totest()mit
totest() return fenster->test()aufrufe kommt das gleiche an der stelle von return.

Was kann ich machen?

Gibt es irgentwie eine beschränkung das man in der WndProc nicht andere bestimmte Funktionen aufrufen kann?- ist das so verständlich gefragt?
Compiler: MS Visual C++ Express 2005
-
Hmm deine Kapselung der WinAPI Fenstermethoden in Klassen scheint fehlerhaft zu sein. Wenn das korrekt wäre, müssten deine Variablen nichtmehr public-access haben. Evtl. zeigst du mal deine Implementierung.
-
Der Debugger markiert nicht- initialisierten speicher mit diesem pattern 0xcccccccc. So soll nicht-initialisierter speicher (z.B. variabeln) erkannt werden können. Es gibt noch andere patterns...
-
Vallan schrieb:
Gibt es irgentwie eine beschränkung das man in der WndProc nicht andere bestimmte Funktionen aufrufen kann?
Speziell für eine WndProc kenne ich keine Einschränkungen - aber bevor du über einen Zeiger die Klassenmethoden aufrufst, solltest du diesen erstmal mit der Adresse eines real existierenden Objekts initialisieren (an der Adresse 0xCCCCCCCC ist nichts, das ist einfach der Defaultwert für nicht-initialisierte Variablen (im Debug-Build)).
-
Vielen Dank!
Ich weiß jetzt immerhin das es daran liegt das die variable anscheinen noch nicht initialisiert ist.
Generelle Frage:
Ab wann ist denn eine MemberVariable initialisiert und "öffentlich" zugänglich bzw ab wann ist denn ein Objekt (für von außerhalb) erstellt? nachdem der Konstruktor komplett durch ist (anders kannich mir das nicht erklären).Und wie könnte ich das dann umgehen?

Edit (3 oder so
) : bzw wie kann ich feststellen ob die Membervariabele initialisiert ist, "if (class->var!=0)" gibt einen error! 
Mein Prob genauer:
ICh habe mal das debuggen gelehrnt(vorher hab ich überall Messageboxen reingepflastrt
) und festgestellt das vorher erfolgeich auf das objekt zugegriffen wurde (undzwar wärend des Konstruktors des mittleren elementes) dann Zeige ich das fenster mit ShowWindow(hWnd,SW_SHOW); an und erhalte die
nachricht (WM_Size) und grife dann aus dieser Funktion (von außen) auf das Member zu, der Debugger sagt das mein Objekt nochnicht erstellt sei.PS: mir fällt grade auf das die Memberfunktionen schon verwendet werden können
nochmehr 
aber immerhin kann die dann auch nicht auf die Membervariablen zugreifen, was mich ein bisschen erleichtert
-
Ab wann ist denn eine MemberVariable initialisiert und "öffentlich" zugänglich bzw ab wann ist denn ein Objekt (für von außerhalb) erstellt? nachdem der Konstruktor komplett durch ist (anders kannich mir das nicht erklären)
Member Variablen sollen eben nicht öffentlich zugänglich gemacht werden (Kappeslung!!). Mach dafür Get/Set Methoden.
Für Variablen gilt:
Initialieren im Konstruktor und wenn nötig löschen im Destruktor.Bsp. Initialisation:
class A { public: // Konstruktor mit Initialisierungsliste A() : m_val(27) { } // Getter int GetVal() const { return m_val; } // Setter void SetVal(int val) { m_val = val; } private: int m_val; };Simon
-
Pouh,
hab die Lösung gefunden:
aus IRGENTWELCHEN Grünenden istthisin der WNDPROC nicht der Zeiger auf die Klasse sondern auf was ganz anderes.
Meine Vorrübergehende Lösung:
Eine globale variable die die oberste bzw benötigte klasse hält.
Bzw, zur kapslung eine Statische Variable "ich" die this enthält( es gibt jewails nur eine instanz)PS: natürlcih werde ich das mit der Kapslung jetzt wieder genauer nehmen.