problemlä mit funktions-zeiger in klasse
-
hi leutz, hab ma wieda a probläm...
also follgender code geht nicht.
class T { void (*pointer)(); void standard(); public: void set(void (*new_h)()) { pointer = new_h; } T() { pointer = standard; //fehler set(standard); //fehler } }; void test() { // bla bla } int main() { T a; a.set(test); //dat geht return 0; }also, wenn ich meinem pointer im konstruktor die standard- funktion zuweisen will, kommen paar fehler meldungen.
last.cpp: In constructor ‘T::T()’: last.cpp:9: error: argument of type ‘void (T::)()’ does not match ‘void (*)()’ last.cpp:10: error: no matching function for call to ‘T::set(<unresolved overloaded function type>)’ last.cpp:5: note: candidates are: void T::set(void (*)())und kennt jemand eine möglichkeit das doch so hinzubiegen das es klappt?
-
Du versuchst im Moment einem Funktionszeiger eine Methode zuzuweisen. Das geht nicht, wie Du schon festgestellt hast.
Möglichkeit 1. Du weist einem Methodenzeiger die Methode zu.
void (T::*pointer)(); void standard(); T() { pointer = &T::standard; }Möglichkeit 2. Du weist dem Funktionszeiger eine Funktion zu.
void (*pointer)(); static void standard(); T() { pointer = &T::standard; }
-
dann ist das doch aber ein globals ding. und das sieht (finde ich jetzt) nicht so geil aus. weil die funktionszeiger sollten schon zur klasse gehöhren.
-
Hm, ich dachte das wäre klar dass das in eine Klasse T gehört

class T { void (T::*pointer)(); void standard(); public: T() { pointer = &T::standard; } };Zweites Beispiel analog.
-
ups hab mich nur verkuckt wie du das meintest.

aber vielen dnak für die hilfe. jetzt läuft es wie geschmiert. habe aber deine zweite möglichkeit nehmen müssen (das mit dem static void standard()) weil ich mit der anderen möglichkeit keine fremdfunktionen also welche die nicht zu class T gehören zuweisen konnte.
thx nochmal
-
Ich will die zweite Variante benutzen, aber ich bekomme den Fehler:
argument of type `void (T::)()' does not match `void (T::*)()'
Wie erstellt man denn eine Variable vom Typ "void (T::)()" bzw. "void (T::*)()"?
class Spiel { private: void (Spiel::aktStatusFunktion)(); public: Spiel() {aktStatusFunktion=ersteFunktion;}; virtual void ersteFunktion() {//bla}; //wird vom Constructor aufgerufen. };wenn ich
void (Spiel::aktStatusFunktion)();schreibe kommt
invalid use of member (did you forget the `&' ?)
Wenn ich dann ein '&' ergänze:
ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&Spiel::ersteFunktion'
Static kann ich die Funktion nicht machen, weil sie gleichzeitig virtual ist.
-
Da fehlt ein * nach dem Spiel:: (siehe mein Beispiel).
-
Ne,ne, Nee:
argument of type `void (Spiel::)()' does not match `void (Spiel::*)()'Das kommt bei
LordJaxom schrieb:
Möglichkeit 1. Du weist einem Methodenzeiger die Methode zu.
C/C++ Code:
void (T::*pointer)();
void standard();
T() {
pointer = &T::standard;
}
C/C++ Code:
void (T::*pointer)();
void standard();
T() {
pointer = &T::standard;
}
C/C++ Code:
void (T::*pointer)();
void standard();
T() {
pointer = &T::standard;
}das andere geht nur mit statik (oder?)
Ich probiere es später aus. Ich hab jetzt keine Zeit.
-
obbba schrieb:
private: void (Spiel::aktStatusFunktion)();Doch, hier fehlt ein Sternchen

Und direkt drunter müssen Adressoperator und Klassenname dazu:
public: Spiel() {aktStatusFunktion=&Spiel::ersteFunktion;};
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.