0

Je ne suis pas en mesure de résoudre cette erreur: CODE:définition de pointeur de fonction en C++ ne fonctionne pas

class myClass 
{ 
    public: 
    void callMain() ; 
    void (*callme)(int a , int b); 

} 
void myClass::callMain() 
{ 
     callSomeApi(callme, <some arguments>); //callme function pointer is passed as argument 
} 

void (myClass :: *callme) (int a, int b)   // it this the correct way to define a function pointer 
{ 

} 

J'obtiens l'erreur suivante dans Visual Studio 2008 erreur C2470: callme ressemble à une définition de fonction, mais il n'y a pas de liste de paramètres; sauter body` apparente

EDIT: Mon idée: 1. Je veux créer pointeur de fonction membre en classe myClass 2. définir la portée à l'extérieur. 3. Passez ce pointeur de fonction en tant que paramètre dans certaines fonctions Api.

+0

Quelle est la signature de 'callSomeApi'? – lijie

+0

(void (*) (int, int), ) – prap19

+0

1) est singleton 'myClass'? 2) les paramètres entiers de l'appel de 'callSomeApi' sont-ils passés au callback? – lijie

Répondre

-1

c'est, mais pourquoi y a-t-il un corps ?? callme est un membre (un pointeur de fonction).

EDIT Je ne sais pas pourquoi c'est downvoted.

On ne va pas autour de l'écriture

int (*a)(int, int) { 
} 

parce int (*a)(int, int); définit une a variable est de type int (*)(int, int).

Si ouvreur veut utiliser une fonction comme un rappel à callSomeApi, il doit faire

class myClass { 
    .... 
    void callme(int a, int b); 
    .... 
} 

void myClass::callMain() { callSomeApi(&myClass::callme, this, <etc>); } 

void myClass::callme(int a, int b) { ... } 

et nous espérons que callSomeApi accepte PMF ou objets de fonction (et utiliser bind ou techniques similaires)

EDIT pour les modifications de l'ouvreur.

Un pointeur sur la fonction membre est un pointeur. ce n'est pas une fonction.

Pour illustrer,

int a() { return 1; } 

définit une fonction a. Cette fonction a le type int(). Une fonction a également un corps de fonction.

Cependant, un pointeur de fonction est définie par:

int (*f)(); 

Dans ce cas f est un pointeur de fonction. Il ne pas avoir un corps de fonction (parce que c'est pas une fonction).

On peut attribuer à des pointeurs de fonction, via =: f = &a; ou f = a;, par exemple, nous permet de faire f(); suite qui fera appel a.

Mais fondamentalement, un pointeur de fonction n'a pas de corps. Ni les pointeurs vers les fonctions membres.

+0

Parce qu'il ne le fait pas :) Il définit un membre qui est de type 'int (myClass :: *) (int, int);' –

+1

@Let_Me_Be: De quoi parlez-vous? 'int (* a) (int, int);' définit un pointeur de fonction normale (pas un pointeur vers un membre) que 'a' soit membre d'une classe ou non. Pour définir un pointeur sur un membre, vous devez toujours utiliser une syntaxe 'int (myClass :: *) (int, int)' même si vous déclarez un pointeur sur un membre qui est lui-même un membre. –

+0

Ouais, désolé je ne devrais pas commenter en travaillant sur autre chose, ça finit toujours mal: -/ –

0

Je pense que vous essayez de faire quelque chose comme cela, mais je peux me tromper

class MyClass 
{ 
    public: 
    typedef void (*funcPtr)(int, int); 
    MyClass(funcPtr whatToCall) 
    { 
    callme = whatToCall; 
    } 
    void myClass::callMain() 
    { 
     callSomeApi(callme, <some arguments>); //callme function pointer is passed as argument 
    } 
private: 
    funcPtr callme; 
}; 

void f(int a, int b) {blah blah blah}; 


int main() 
{ 
    MyClass myObject(f); 
    myObject.callMain(); //will call the api function with f passed as argument 
} 
+0

pas exactement .... je suppose que mon Q est très clair ... je veux définir le pointeur de fonction comme un normal Q et den passent le nom du pointeur de fonction comme argument à la fonction API ... comment s'y prendre – prap19

+0

@ prap19: Non, en fait, votre question n'est pas claire du tout. Voulez-vous passer une fonction membre en tant que paramètre à une fonction qui prend un pointeur simple? –

+0

J'ai édité le Q. Je suppose que c'est clair maintenant. Sinon, je vais en dire plus. – prap19

0

Il est difficile de dire ce que vous essayez de faire ici. Voulez-vous définir callme comme méthode, puis lui passer un pointeur comme premier paramètre de callSomeApi()? Dans ce cas, définissez-le simplement comme une ancienne méthode, et tapez callSomeApi(&callme, ...) dans callMain(): vous n'avez pas besoin d'un membre de pointeur de fonction dans votre classe.

Si vous avez besoin d'un pointeur de fonction en tant que membre pour une raison quelconque, votre déclaration dans la ligne 5 est correcte, et vous pouvez taper callme = &someFunction pour régler le pointeur pour pointer vers someFunction(), qui devrait être défini ailleurs.

+0

La fonction callAPI prend les paramètres, et le 1er paramètre est le pointeur de fonction. – prap19

+0

Je comprends cela, mais avez-vous réellement besoin de stocker un pointeur de fonction dans votre classe? Ou voulez-vous simplement passer un pointeur sur l'une de vos méthodes pour 'callSomeApi()'? – suszterpatt

Questions connexes