Je ne recommande pas l'utilisation du modèle public struct. Le modèle de conception correct, pour la POO en C, est de fournir des fonctions pour accéder à toutes les données, sans jamais permettre un accès public aux données. Les données de la classe doivent être déclarées à la source, afin d'être privées, et être référencées de manière directe, où Create
y Destroy
fait l'allocation et la libération des données. De cette manière, le dilemme public/privé n'existera plus.
/*********** header.h ***********/
typedef struct sModuleData module_t'
module_t *Module_Create();
void Module_Destroy(module_t *);
/* Only getters and Setters to access data */
void Module_SetSomething(module_t *);
void Module_GetSomething(module_t *);
/*********** source.c ***********/
struct sModuleData {
/* private data */
};
module_t *Module_Create()
{
module_t *inst = (module_t *)malloc(sizeof(struct sModuleData));
/* ... */
return inst;
}
void Module_Destroy(module_t *inst)
{
/* ... */
free(inst);
}
/* Other functions implementation */
D'un autre côté, si vous ne voulez pas utiliser Malloc/Free (qui peut être une surcharge inutile dans certaines situations), je vous suggère de cacher la structure dans un fichier privé. Les membres privés seront accessibles, mais c'est à la charge de l'utilisateur.
/*********** privateTypes.h ***********/
/* All private, non forward, datatypes goes here */
struct sModuleData {
/* private data */
};
/*********** header.h ***********/
#include "privateTypes.h"
typedef struct sModuleData module_t;
void Module_Init(module_t *);
void Module_Deinit(module_t *);
/* Only getters and Setters to access data */
void Module_SetSomething(module_t *);
void Module_GetSomething(module_t *);
/*********** source.c ***********/
void Module_Init(module_t *inst)
{
/* perform initialization on the instance */
}
void Module_Deinit(module_t *inst)
{
/* perform deinitialization on the instance */
}
/*********** main.c ***********/
int main()
{
module_t mod_instance;
module_Init(&mod_instance);
/* and so on */
}
1 votes
Pourquoi faire si compliqué - Si l'outil ne fait pas ce dont vous avez besoin, utilisez-en un autre.
0 votes
Je pense que cela violerait les règles d'aliasing des objets, au moins en C99. Je sais que c'est le cas en C++.
35 votes
Ce serait terrible de fermer ce site ! Pourquoi les gens votent-ils à la baisse sur une question aussi valable ? Parce qu'ils ont oublié comment faire les choses en C ?
0 votes
N'essayez pas de cacher des choses. Utilisez simplement des noms pour les membres "privés" afin qu'il soit absolument clair que personne ne doit les toucher. Et si quelqu'un les utilise, réprimandez-le. Ou changez les noms pour les éduquer.