2010-10-01 4 views
2

Je ne suis pas encore très familier avec ceux-ci, mais peut-être quelqu'un peut faire la lumière sur cet exemple. Imaginez que j'ai la classe CFoo et qu'il y aura une fonction pour ajouter un gestionnaire et une fonction qui est un pointeur de fonction.Utilisation de pointeurs de fonction?

donc quelque chose comme ceci:

class CFoo { 

int *pointedFunc(int a, int b) = 0; 

void setFunc(int *func(int a, int b)) 
{ 
    pointedFunc = func; 
} 
}; 

Compte tenu du contexte ci-dessus, je veux connaître la bonne façon de le faire. Je ne pense pas l'avoir fait correctement. Aussi, comment pourrais-je appeler à propos de pointedFunc?

Merci

+1

Non "une * fonction * qui est un pointeur de fonction", mais "une variable membre * * (connue dans OO comme * champ *) qui est un pointeur de fonction". –

+0

Veuillez éviter les pointeurs de fonction dans le code C++. Définir une interface et créer des types qui implémentent cette interface. Vous pouvez ensuite stocker des objets sans devoir recourir à C hocks-pockus de pointeurs de fonction. –

+0

@Martin: Parfois, une interface est la bonne approche, parfois des foncteurs modélisés (et typés Duck), et parfois les pointeurs de fonction sont les meilleurs. Spécialement pour la liaison dynamique, des pointeurs de fonction sont nécessaires. –

Répondre

8

À l'heure actuelle, vous avez une fonction membre retournant int *, pas un pointeur vers une fonction retournant int. Un ensemble de parenthèses réglerait cela.

int (*pointedFunc)(int a, int b); 

void setFunc(int (*pfunc)(int a, int b)) 
{ 
    pointedFunc = pfunc; 
} 

En outre, les variables membres initialisés dans le constructeur cteur-initialiseur liste, comme

CFoo::CFoo() : pointedFunc(0) {} 

pas comme vous l'avez fait. Votre = 0 était en fait un spécificateur pur (et cela ne fonctionnera que si la fonction membre est virtuelle), lorsque vous corrigez le problème pointer-return-type vs pointer-to-function, vous trouverez que le compilateur se plaint également de votre tenter de l'initialiser.

Using a typedef as Graeme suggests est le moyen le plus simple et le meilleur de suivre les types de pointeur de fonction.

+0

Oh merci, je ne savais pas que c'était seulement pour les fonctions virtuelles – jmasterx

+0

Ce n'est pas tant que c'est pour les fonctions virtuelles, car '= 0' signifie quelque chose ** complètement différent ** (repère Monty Python) quand il apparaît dans un déclaration de fonction comme lorsqu'elle apparaît dans une déclaration de données.En fait, int (* pointFunc) (int a, int b) = 0; 'serait parfaitement OK en tant que variable locale, qui peut être initialisée, mais les variables membres sont initialisées dans le constructeur et non dans la déclaration. –

+0

Bien que vous ayez certainement raison de définir une fonction elle-même = 0 étant un spécificateur pur, j'ai l'impression que vous pouvez définir une fonction * pointeur * sur NULL sans problèmes, ce qui, je crois, était l'intention originale. – Bryan

3

Dans votre exemple, pointedFunc est une fonction membre qui retourne un int *. Pour en faire un pointeur de fonction, vous avez besoin parens autour pointedFunc, comme:

int (*pointedFunc)(int a, int b); 

Un typedef pourrait le rendre plus clair:

class CFoo { 
    CFoo() : pointedFunc(NULL) {} 
    typedef int (*funcType)(int, int); 
    funcType pointedFunc; 

    void setFunc(funcType f) { 
     pointedFunc = f; 
    } 
}; 

Pour appeler la fonction, vous pouvez utiliser pointedFunc(1, 2) ou (*pointedFunc)(1, 2). J'ai tendance à utiliser ce dernier pour indiquer clairement que vous passez par un pointeur de fonction, mais l'un ou l'autre fonctionnera.

+2

Non ce n'est pas bien, en ce moment il a une fonction membre nommée 'pointedFunc' et le type de retour est' int * '. –

+0

bien merci, je suppose que je manque de confiance en soi: p – jmasterx

+0

@Ben: Vous avez raison - merci pour la clarification. J'ai corrigé ma réponse. –

Questions connexes