Listing 9

/* OBJ.C - implement private data storage
 *           for each object */

/* note we no longer need to include obj.h */

#include <stdio.h>
#define GETCOLOR 0
#define SETCOLOR 1

#define YELLOW 14
#define BLUE 9
#define RED 12

/* duplication of typedef struct circle */
typedef struct circle
   {
   void *pprivate;

   /* action pack is now accessed with
    * a pointer to a pointer to a function
    * returning int
    */
   int (**pcact)();
   } CIRCLE;

main()
   {
   CIRCLE c1, c2; /* declare two circles */
   int color;

   /* call the constructor for each circle */
   constructor(&c1, YELLOW);
   constructor(&c2, RED);

   /* use the act pack to get color */
   color = (*c1.pcact[GETCOLOR])(&c1);
   printf("Color of c1 is %d\n", color);

   color = (*c2.pcact[GETCOLOR])(&c2);
   printf("Color of c2 is %d\n", color);

   (*c1.pcact[SETCOLOR])(&c1, BLUE);
   printf("Setting color of c1 to BLUE\n");

   color = (*c1.pcact[GETCOLOR])(&c1);
   printf("Color of c1 is now %d\n", color);

   (*c2.pcact[SETCOLOR])(&c2, YELLOW);
   printf("Setting color of c2 to YELLOW\n");

   color = (*c2.pcact[GETCOLOR])(&c2);
   printf("Color of c2 is now %d\n", color);

   destructor(&c1); /* free circle storage */
   destructor(&c2);
   }
/* End of File */


/* SAMPLE OUTPUT FROM LISTING 9 */
Color of c1 is 14
Color of c2 is 12
Setting color of c1 to BLUE
Color of c1 is now 9
Setting color of c2 to YELLOW
Color of c2 is 14
*/