Funktionsaufruf über Funktionszeiger
-
Hi,
ich hab vielleicht ein Detail vergessen. Denn die Funktion Test befindet sich nicht in der Klasse, sondern ist außerhalb.

Gruß Chris
-
Warum ist click_Button static?
-
Ich hab es ohne versucht. Aber dann funktioniert die Funktion nicht.
(Es handelt sich hierbei um die Panda3D Eingine. Also ich arbeite nicht mit der MFC. Das nurmal am Rande.)
-
...
-
...
-
TheChrissy schrieb:
Ich hab es ohne versucht. Aber dann funktioniert die Funktion nicht.
Aha.
Du übergibst also schon click_Button an eine Engine.
Dann gibts kein this und kein this->PT_GButton_Function.
Steckt der Button dann irgendwie im *ev oder *data?
Dann könnte man noch (static_cast<GButton*>(data)->PT_GButton_Function)() aufrufen.
Aber irgendwoher mußt Du den Button kriegen, wenn Du auf ein Button-Attribut zugreifen willst.
-
CSpille schrieb:
TheChrissy schrieb:
Ich hab es ohne versucht. Aber dann funktioniert die Funktion nicht.
(Es handelt sich hierbei um die Panda3D Eingine. Also ich arbeite nicht mit der MFC. Das nurmal am Rande.)
Von welchem Objekt, willst du denn den Funktionszeiger haben?
Der Zeiger ist ja Teil eines Objektes
Der Zeiger soll auf eine Funktion außerhalb des Objekts zeigen.
Weil Ich möchte mit meiner Klasse also mehrere Buttons erstellen können (was bisher auch super klappt) nur soll jeder Button eine andere Funktion aufrufen können.
Deshalb möchte ich die Adresse der Funktion, die außerhalb der Klasse liegt angeben um diese dann im Zeiger in der Klasse zu speichern und beim Klick auf den Button die Funktion über den Zeiger zu öffnen.
GButton B; B.PT_GButton_Function = test;test soll dann die aufzurufende Funktion sein.
EDIT:
Der Button wird ja bereits von der Engine bereitgestellt.framework.define_key(PT_GButton->get_click_event(MouseButton::one()), "OwnButtonPress", &click_Button, PT_GButton);Beim Anklicken wird die Funktion click_Button geöffnet und dabei wird PT_GButton übergeben. Letzere ist vom Typ PGButton.
Den Funktionszeiger direkt an die Funktion zu liefern lief wegen der konvertierung schief. Da wollte ich mich nicht durch quälen.
-
...
-
Den Funktionszeiger direkt an die Funktion zu liefern lief wegen der konvertierung schief. Da wollte ich mich nicht durch quälen.
Das wäre aber vielleicht das beste. Aber ich bin jetzt zu müde.
Aber ich hab mal in die Hilfe http://www.panda3d.org/reference/cxx/class!_panda_framework#a8cbe4d170ec020f156fc7eec048242a5 geschaut.
void PandaFramework::define_key ( const string & event_name, const string & description, EventHandler::EventCallbackFunction * function, void * data );Sets up a handler for the indicated key. When the key is pressed in a window, the given callback will be called. The description is a one-line description of the function of the key, for display to the user.
Aha, der mag am liebsten gleich eine EventHandler::EventCallbackFunction?
typedef void EventHandler::EventCallbackFunction(const Event *, void *);
-
Also, ich glaube hier ist vielleicht noch etwas aufklärung nötig.

GButton ist die von mir geschriebene Klasse.
Der Button an sich wird ja schon von der Engine bereitgestellt. Alles nötige für einen Button will ich halt immer wieder über meine Klasse erstellen können.
Das Hier wird von der Engine bereitgestellt. Der Button ist fertig.
PGButton *PT_GButton; PT_GButton = new PGButton("OwnButton"); framework.define_key(PT_GButton->get_click_event(MouseButton::one()), "OwnButtonPress", &click_Button, PT_GButton);PT_GButton ist also der Button der angeklickt wird.
Meine Klasse (GButton) bekommt lediglich alle Werte um den Button einfach erstellen zu können. Unteranderem auch die Funktion die beim klicken ausgeführt werden soll.Ich will bloß die Funktion die sich dann außerhalb der Klasse befindet mit dem Funktionszeiger der in der Klasse GButton deklariert ist öffnen.
Mit deiner Methode kommt zwar kein Fehler mehr, doch sobald der Button erstellt wird bricht das Programm ab. Das liegt sicherlich am data.
Ich dachte ich könnte einfach über den Funktionszeiger die Funktion aufrufen.
-
volkard schrieb:
Aha, der mag am liebsten gleich eine EventHandler::EventCallbackFunction?
Das hab ich auch schon herausgefunden, nur erwies sich die Übergabe als Problematisch, da es immer wieder konvertierungs Fehler gab.
-
GButton B;//Dein Button B.PT_GButton_Function = test;//Und Dein Handler //in einer Methode von GButton: PGButton *PT_GButton;//Buttom des Frameworks PT_GButton = new PGButton("OwnButton"); framework.define_key(PT_GButton->get_click_event(MouseButton::one()), "OwnButtonPress", &click_Button, this); //this ist der aktuelle GButton, der sich gerade seine Grafik-Objekte anlegt. //Und genau der wird dann der click_Button als data übergeben werden. //Und dann kann man ihn auch mit static_cast wieder zum GBUtton machen.
-
...
-
Danke an alle. Also das Programm startet schonmal. Den Button kann ich auch erstellen. Doch sobald ich ihn anklicke bricht das Programm mit einer "Unbehandelten Ausnahme" ab. Das ist die Stelle mit dem static_cast.
Ich hab zwar noch nie mit static_cast gearbeitet. Aber ich glaube hier bekommt der PT_GButton_Function etwas aufgedrückt was er gar nicht braucht. Denn er hat ja eigentlich keinen Bezug zum "grafischen" Button. Er soll ja bloß Zugriff auf eine Klasse ermöglichen, die sich außerhalb der Klasse befindet.
Hoffe ich bringe hier jetzt nicht alles durcheinander

Gruß Christopher