est ici un modèle qui apparaît en C fréquemment que émule POO:
Tenir compte d'une classe nommée MyClass.
/* MyClass.h or myclass.h */
#ifndef MYCLASS_H
#define MYCLASS_H
struct myclass_s;
typedef struct myclass_s myclass_t;
myclass_t * myclass_new();
void delete_myclass(myclass_t *);
// Method int doMyStuff(int arg1,int arg2)
int myclass_doMyStuff(myclass_t *, int arg1, int arg2);
#endif //MYCLASS_H
Le fichier d'en-tête définit le type myclass_t, mais masque l'implémentation myclass_s. Cette exigence quelque peu incommode d'avoir deux noms vient de C ayant des structures dans un espace de noms séparé, tandis que dans les structures C++ sont dans le même espace de noms que tous les autres types. Le code est destiné à fonctionner en C et C++. Voici le fichier .c correspondant:
/* MyClass.c or myclass.c */
#include "myclass.h" // Or MyClass.h
struct myclass_s {
int exampleField;
};
myclass_t * myclass_new()
{
myclass_t * o=(myclass_t*)malloc(sizeof(myclass_t));
// Initialize o here.
return o;
}
void myclass_delete(myclass_t * o)
{
// Do any cleanup needed on o here.
free(o);
}
int myclass_doMyStuff(myclass_t * o,int arg1,int arg2)
{
// ...
}
L'héritage et la liaison dynamique sont également possible de faire en C, mais ils sont un peu plus impliqués. Le modèle ci-dessus, ou n'importe quel modèle qui modélise la POO, n'est pas toujours la meilleure façon de faire les choses en C, alors essayez de ne pas vous accrocher à la façon de penser centrée sur la classe. Pourtant, ce modèle est parfois utile. Par exemple, libpng utilise quelque chose de proche (ils font aussi des 'exceptions' en utilisant setjmp/longjmp, ce que je déconseille).
cela dépend entièrement du problème que vous résolvez – dharga
Pourriez-vous donner quelques exemples? – Backus
Il ne recherche pas terriblement bien, mais cela a été répondu sur Stack Overflow à plusieurs reprises. Des liens quand j'y arrive. – dmckee