In Ordnung, so gibt mir das ein void * ist kein Zeiger auf den Objekttyp. Ich versuche nur, eine void-Funktion als Parameter für meine Konstruktoren zu übergeben.Wie würde ich eine Funktion als Parameter in C++ übergeben
Antwort
Sie haben 2 Probleme.
Die erste ist, dass Sie nicht die korrekte Syntax für einen Funktionszeiger haben.
Die Syntax für einen Funktionszeiger ist
return_type(*name)(arguments)
Da Ihre Funktion void
Rückgabetyp hat und nimmt keine Argumente, es ist
void(*f)()
Die zweite bei dem Versuch, den Pass ist Funktionszeiger f
zum Basisklassenkonstruktor
Hier sind Sie vorbei die Typ auf die Basisklasse, wenn in der Tat Sie wollen einfach nur die Variable übergeben
Falsche (sowohl in Bezug auf die Syntax und das Bestehen der Typ des Arguments)
Stepper(x,y,z,void(*f))
Correct (nur passieren f
, die Funktionszeiger Variable selbst
Stepper(x,y,z,f)
Hier ist der Code mit den Korrekturen:
class Stepper
{
public:
Stepper(int en,int dir, int clk, void(*f)())
{
}
};
class Turret : public Stepper
{
public:
Turret(int x,int y, int z,void (*f)()):Stepper(x,y,z,f)
{
}
};
void TurretStep()
{
}
Turret t(2,3,4,TurretStep);
Sie haben vergessen, die leere Klammer auf die Funktionszeiger hinzuzufügen:
void(*f)()
^^
no arguments
Auch Stepper(x,y,z,void(*f))
ist auch falsch, weil f
nur eine Variable ist (wie x
, y
und z
), also warum Besetzung es zu void
?
Stepper(x, y, z, f); //'f' is just like a "normal" variable
Ich benutze diese Art und Weise zu tun:
typedef void (TURRETSTEP)();
class Stepper
{
public:
Stepper(int en,int dir, int clk, TURRETSTEP* f)
{
}
};
class Turret : public Stepper
{
public:
Turret(int x,int y, int z, TURRETSTEP* f): Stepper(0, 0, 0, f)
{
}
};
void TurretStep()
{
}
Ich erkläre ein typedef eine "Funktionsschablone" definiert, ist einfach zu tun:
wenn Ihre Funktion ist (zum Beispiel):
char* ReadString(int a, short b, int etc);
einfach umgeben Funktionsnamen mit Klammern, und es so groß geschrieben machen:
char* (READSTRING)(int a, short b, int etc);
und fügen Sie typedef-Deklaration:
typedef char* (READSTRING)(int a, short b, int etc);
Ich würde vorschlagen, C++ 'using' Syntax:' mit TURRETSTEP = void (*)(); ' –
duplizieren? http: // Stapelüberlauf.com/questions/25860157/passing-a-void-Funktion-als-Argument-zu-einer anderen-Funktion –
Sie können 'std :: function' http://en.cppreference.com/w/cpp/utility verwenden/funktional/funktion –