2016-05-07 1 views
1

Voici un extrait de code.Pointeur vide et conversion dans l'argument de fonction

class NetworkRequestChannel { 
public: 
    ... 

    NetworkRequestChannel(const unsigned short _port_number, 
    void * (*connection_handler) (int *)); 
    ... 
private: 
    ... 
} 

Ma question concerne l'argument void * (*connection_handler) (int *). J'ai une vague idée de la façon de le lire, et c'est comme un pointeur vide vers un objet nommé connection_handler qui est ensuite converti en un pointeur int. Mais je sais que c'est presque certainement faux, et je ne sais pas comment l'interpréter autrement.

+5

C'est un pointeur de fonction, acceptant une fonction qui prend un seul 'int *' comme argument et retourne une valeur 'void *' (une adresse de mémoire générique). Le paramètre lui-même est nommé 'connection_handler'. – mukunda

+0

Notez que 'class NetworkRequestChannel' indique que c'est C++, pas C. La réponse est la même, mais le code montré n'est pas valide C. –

+0

C'est quelque chose d'autre que j'ai été confus au sujet de quelque temps. Je dois admettre que c'est pour une classe, c'est pourquoi j'essayais de ne pas mettre trop de détails et d'obtenir une réponse simple. Cependant, dans toutes les affectations de mes professeurs, ses fichiers sont des fichiers C avec des extensions «.C» et «.H». Cependant, HE utilise des classes même dans ses propres fichiers prédéfinis, et le makefile qui nous est donné utilise 'g ++ -g'. C'est comme un hybride C/C++ qu'il essaie de faire que je n'ai pas vu jusqu'à ce cours. – UnworthyToast

Répondre

1

L'argument

void * (*connection_handler) (int *) 

est un pointeur vers une fonction qui prend un argument de type int* et en retournant une void*

0

Il est la syntaxe pour un pointeur de fonction. Le paramètre en question acceptant une fonction qui prend un int* comme argument et renvoie une valeur void* (une adresse de mémoire générique).

Vous pouvez en savoir plus à ce sujet here.

(C'est tout à fait un ancien article, et j'encourage les gens à commenter ou modifier cette réponse à la liste ceux qui mettent l'accent sur les pratiques C++ modernes. Ne tenez pas compte cela si l'article que je Liées est en fait à jour avec les meilleures pratiques!)