Etant un habituer du C++ plutôt que de du C. Je me demande si il existe un moyen d'implémenter ce design pattern en C.
Par une approche typée objet par exemple, en créant des structures assimilées a des objets.
Etant un habituer du C++ plutôt que de du C. Je me demande si il existe un moyen d'implémenter ce design pattern en C.
Par une approche typée objet par exemple, en créant des structures assimilées a des objets.
On peut faire quelque chose de similiaire en gardant toute la structure secréte et travaillant avec des fonctions dédiées.Envoyé par chronos
Pour garder la structure secréte il suffit de la définir dans le .c de ton module et tes fonctions prendront en paramètre un pointeur void*.
Du coup, de l'extérieur du module, tu auras un pointeur vers ta structure mais aucun moyen de connaître sa taille, ce qu'elle contient, etc...
Ce qui veut dire qu'on ne peut pas en allouer derrière ton dos et donc on doit passer par ta fonction de création dans laquelle tu peux gérer l'idée du singleton.
Pas sûr que cela soit très conseillé par contre,
Jc
Salux
Pas besoin de passer par un void *. Cette technique suffit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /* .h */ struct _MonTypeAbstrait; typedef struct _MonTypeAbstrait MonTypeAbstrait; MonTypeAbstrait * mta_create(void); /*...*/ /* .c */ struct _MonTypeAbstrait { int a; char * b; }; /*...*/
J'avais pensé à quelque chose comme la solution de Gruik, effectivement la solution avec du void* ne me plait pas trop![]()
Au final je vais refaire un semblant d'objet avec du C, merci pour vos réponses![]()
Aprés pour avoir un comportement de type singleton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 /*.c contentant ton destroy et ton create*/ static int iCpt = 0; int MYCLASS_Create(...) { if( iCpt == 0) { //creer iCpt++; } else //erreur //... return //code d'état } int MYCLASS_Destroy(...) { if( iCpt > 0) { //detruire iCpt--; } else //erreur //... return //code d'état }
et ça n'a rien de nouveau, c'est extrêmement fréquent en C....Envoyé par chronos
![]()
Partager