Comment utiliser un pointeur de fonction dans une structure C?
Je veux en savoir plus sur l'utilisation de pointeurs de fonction en C structs comme une façon d'imiter les objets de la programmation orientée, mais dans ma recherche, j'ai juste trouvé des questions comme cette où la réponse est tout simplement à utiliser un pointeur de fonction sans en décrire comment cela pourrait fonctionner.
Ma meilleure supposition est quelque chose comme cela
#include <stdio.h>
#include <stdlib.h>
struct my_struct
{
int data;
struct my_struct* (*set_data) (int);
};
struct my_struct* my_struct_set_data(struct my_struct* m, int new_data)
{
m->data = new_data;
return m;
}
struct my_struct* my_struct_create() {
struct my_struct* result = malloc((sizeof(struct my_struct)));
result->data = 0;
result->set_data = my_struct_set_data;
return result;
}
int main(int argc, const char* argv[])
{
struct my_struct* thing = my_struct_create();
thing->set_data(1);
printf("%d\n", thing->data);
free(thing);
return 0;
}
Mais qui me donnent des avertissements du compilateur warning: assignment from incompatible pointer type
, alors, évidemment, je suis en train de faire quelque chose de mal. Quelqu'un pourrait-veuillez nous fournir un petit exemple de comment utiliser un pointeur de fonction dans une structure C correctement?
Ma classe enseigné dans C ne fait même pas mention. Il me fait me demander si ce sont réellement utilisés par les programmeurs C. Quels sont les avantages et les inconvénients de l'utilisation de pointeurs de fonction en C structs?
(struct my_struct *, int)
et la définition de la structure a seulement (int)
Lequel dois-je changer?
Vous devriez changer le pointeur de fonction dans la structure de la définition de
struct my_struct* (*set_data) (struct my_struct*, int);
si vous souhaitez affecter my_struct_set_data()
.
OriginalL'auteur Eva | 2012-07-14
Vous devez vous connecter pour publier un commentaire.
Dans votre structure de la définition, de le modifier pour
et maintenant, utilisez le pointeur de fonction dans main comme
Pourriez-vous revenir sur votre question un peu plus? Si vous voulez dire, quels sont les avantages d'avoir un struct en C contenant des pointeurs de fonction (vraisemblablement) fonctionnent sur la structure elle-même, le plus utile avantage que je pouvais penser, c'est le polymorphisme. Par exemple, vous souhaitez définir plusieurs
set_data()
fonctions, et tout struct pourrait choisir uneset_data()
la fonction qui lui convient. Puis, quand vous êtes de traitement de plusieurs de vos structures, vous n'avez pas besoin de choisir les données de jeu de la fonction le particulier struct va utiliser; il est déjà "intégré" dans la structure.Vous juste ne pouvez pas attendre de
thing->set_data(value)
se comportent de la même manière, il serait en C++. La fonction pas ont aucune référence àthing
. Vous pouvez penser au sujet d'un appel de méthode en C++ étant converti à partirthing->do_stuff()
àThingsClass_do_stuff(thing)
ou mêmething->_vtable->do_stuff(thing)
si la méthode est virtuelle.Je suppose que ma vraie question avec les avantages et les inconvénients est de savoir quand utiliser l'un plutôt que l'autre? Il est de coutume d'avoir à la fois un my_struct_set_data méthode et un set_data méthode à l'intérieur de mon struct ou ne programmeurs C utilisez simplement la première et surtout d'utiliser le second pour le polymorphisme?
Personnellement, l'idée d'utiliser les deux méthodes ensemble me fait un peu peur. Je voudrais juste écrire un
my_struct_set_data()
méthode et de quitter la structure, sans pointeurs de fonction, mais c'est juste moi. Donc, si je suis représentant typique de la programmeur en C, alors oui, C programmeurs utilisez simplement la première et surtout d'utiliser le second pour le but exprès de polymorphisme!OriginalL'auteur Andy Stow Away
La réponse donnée par Andy Ranger corrige mon message d'avertissement du compilateur, mais n'a pas répondu à ma deuxième question. Les commentaires de cette réponse donnée par eddieantonio et Niklas R répondre à ma seconde question, mais ne pas corriger mon message d'avertissement du compilateur. Je suis donc le regroupement de les réunir en une seule réponse.
C est pas orienté objet, et tentant de reproduire conception orientée objet en C est généralement le résultat dans le mauvais style. Dupliquer les méthodes appelées sur les structures afin qu'elles puissent être appelées à l'aide d'un pointeur vers une struct que j'ai dans mon exemple n'est pas une exception. (Et franchement, il viole SEC.) Pointeurs de fonction dans les structures ne sont plus utiles pour le polymorphisme. Par exemple, si j'avais une struct vecteur qui représente un conteneur générique pour une séquence linéaire d'éléments, il peut être utile de stocker un comparison_func membre d'un pointeur de fonction pour permettre de tri et de recherche par le vecteur. Chaque instance du vecteur pourrait utiliser une autre fonction de comparaison. Toutefois, dans le cas d'une fonction qui fonctionne sur la structure elle-même, il est préférable de style d'avoir une seule fonction distincte qui n'est pas reproduit dans la struct.
Cela rend la réponse à ce qui est juste plus compliqué. Est ce qui est correct comment faire pour que mon exemple ci-dessus de la compilation? Est-il comment reformater mon exemple ci-dessus de sorte qu'il a un bon style? Ou est-il ce qui est un exemple d'une structure qui utilise un pointeur de fonction de la façon dont programmeur C serait-il le faire? Dans la formulation de ma question, je n'ai pas anticiper la réponse étant que ma question était mal. Pour être complet, je vais vous donner un exemple de chaque réponse à la question.
La fixation de l'Avertissement du Compilateur
De reformater le Style
Démontrant une Utilisation de Pointeur de Fonction dans les Structures
OriginalL'auteur Eva