Я не рекомендую использовать шаблон публичной структуры. Правильный шаблон проектирования для ООП в C состоит в том, чтобы предоставлять функции для доступа к любым данным, никогда не позволяя публичный доступ к данным. Данные класса должны быть объявлены в источнике, чтобы быть частными, и ссылаться на них в прямом направлении, где Create
и Destroy
делают распределение и свободны от данных. Таким образом, государственная / частная дилемма больше не будет существовать.
/*********** 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 */
С другой стороны, если вы не хотите использовать Malloc / Free (что может быть ненужным в некоторых ситуациях), я предлагаю вам скрыть структуру в личном файле. Частные участники будут доступны, но это на усмотрение пользователя.
/*********** 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 */
}