Strukturę danych deklarujmy w pliku .c a wiec tylko tam będą widoczne jej szczegóły.
Kod: Zaznacz cały
/* opak.c */
#include "opak.h"
//struktura która będzie ukryta pod "opakowanym" wskaźnikiem
typedef struct Opak {
int ene;
char due;
char *like;
long fake;
} Opak;
//Konkretne instancje obiektu Opak zaalokowane statycznie
Opak opakObjOne;
Opak opakObjTwo;
//funkcja operująca na obiekcie Opak
void jakasMetoda(Opak * const opak)
{
...
}
Plik nagłówkowy pokazuje tylko to co niezbędne. Co prawda użycie zmiennych extern kłóci się z zasadą "najlepsza zmienna globalna to taka przed którą umieszczone są dwa slasze", ale w tym wypadku nie wiadomo nic o ich typie więc kompilator nie pozwoli na jakiekolwiek, a prawdopodobnie nieporządane, operacje na zmiennych (oczywiście poza operacjami za pośrednictwem dostarczonych metod).
Kod: Zaznacz cały
/* opak.h */
//deklaracje obiektów Opak, których struktura jest całkowicie niewidoczna
extern struct Opak opakObjOne;
extern struct Opak opakObjTwo;
//deklaracja metody operującej na obiekcie Opak
void jakasMetoda(struct Opak * opak);
Niepełna deklaracja typu Opak nie przeszkadza w użyciu danych o tym typie, ale tylko w operacjach dozwolonych (czyli za pomocą dostarczonych metod)
Kod: Zaznacz cały
/* main.c */
#include "opak.h"
int main()
{
// ...
jakasMetoda(&opakObjOne);
// ...
jakasMetoda(&opakObjTwo);
// ...
return 0;
}
.