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?

L'avertissement du compilateur peut-être parce que la liste d'arguments dans la fonction réelle ne correspond pas à celle de la liste d'arguments de la struct var: la fonction réelle a (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