2016-06-24 13 views
4

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

+0

duplizieren? http: // Stapelüberlauf.com/questions/25860157/passing-a-void-Funktion-als-Argument-zu-einer anderen-Funktion –

+0

Sie können 'std :: function' http://en.cppreference.com/w/cpp/utility verwenden/funktional/funktion –

Antwort

6

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); 
1

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 
1

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); 
+0

Ich würde vorschlagen, C++ 'using' Syntax:' mit TURRETSTEP = void (*)(); ' –