Funktionszeiger
-
Hallo,
ich habe ein kleines Problem mit Funktionszeigern:
Wenn ich schreibetypedef void (*EventFunction)(uint); void test(uint _x) { MessageBox(... } class CButton : CComponent { CButton() { // ... this->OnClick = &test; } // ... }; void CComponent::Memberfunktion { (*this->OnClick)(3); }
dann klappt alles. Wenn ich aber test als Memberfunktion
von CButton schreibe, dann sagt mein Compiler:Interface.h(49): error C2440: '=': 'void (__thiscall Editor::Interface::Menue::* )(uint)' kann nicht in 'EventFunction' konvertiert werden
Der Konstruktor sieht so aus:
CButton() { //... this->OnClick = &CButton::test; }
Wie kann man das machen?
-
Hallo,
du willst einen Zeiger auf eine Elementfunktion. Dort hast du das Problem, dass
noch der this-Zeiger implizit mitgefuehrt wird. Deine Deklaration muss wie folgt
aussehen:void (CComponent::*ElemFunc)();
mfg
v R
-
Zunächst mal vielen Dank für die schnelle Antwort.
Leider klappt das nicht
:
Wenn ich schreibe
this->OnClick = (CButton::*test)();
, dann sagt mein VC++.NET-Compiler:
Interface.h(49): error C2059: Syntaxfehler: '<tag>::*'
Das mit dem "*" kann also nicht ganz richtig sein, auch wenn ich das schon auf anderen Websites gesehen habe.
Ich habe auch probiert den * davorzuschreiben, dass geht genauso wenig.Habt ihr noch eine Idee?
-
Nabend,
sry, aber ich glaub das ist nicht ganz ruebergekommen. Du machst ein Typedef:
typedef void (CComponent::*ElemFunc)();
Irgendwo in deiner Klasse steht z.B.:
class X { private: ElemFunc onEvent; }
In deinem CTor steht dann sowas:
onEvent = &CComponent::Elementfunktion;
Du benoetigst allerdings noch eine Instanz von CComponent, um die Element-
funktion aufrufen zu koennen.mfg
v R
-
Jetzt sagt er mir:
Components.h(3): error C2645: Kein vollständiger Name für Elementzeiger ('::*' gefunden)
Ich habe im prinztip das gemacht, was du gesagt hast:
typedef void (SDLComponents::CComponent::*EventFunction)(uint); ... class CComponent { ... EventFunction OnClick; }; ... class CButton : CComponent { public: CButton() { ... this->OnClick = &CButton::test; } };
Ich vermute, dass das mit der Vererbung zusammenhängt.
Außerdem ist da das Problem: Wo soll ich denn den typedef machen?
Vor der Klassendefinition ist die Klasse nicht bekannt (fehlermeldung oben?), und nach der Klassendefinition ist es zu spät, weil die Klasse den Typ benötigt.
Was nun?
-
hm, und wenn Du das direkt so schreibst?
class CComponent { .. typedef void (SDLComponents::CComponent::*EventFunction)(uint); ... EventFunction OnClick; }; ... class CButton : CComponent { public: CButton() { ... this->OnClick = &CButton::test; } };