Skip to content

Instantly share code, notes, and snippets.

@kaneshin
Last active August 29, 2015 14:18
Show Gist options
  • Select an option

  • Save kaneshin/2433267bcfbf5d6837b7 to your computer and use it in GitHub Desktop.

Select an option

Save kaneshin/2433267bcfbf5d6837b7 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
typedef enum {
GENDER_NEUTRAL,
GENDER_MALE,
GENDER_FEMALE,
GENDER_UNKNOWN,
} gender;
char *
gender_string(gender gen)
{
switch (gen) {
case GENDER_NEUTRAL:
return "Neutral";
case GENDER_MALE:
return "Male";
case GENDER_FEMALE:
return "Female";
case GENDER_UNKNOWN:
return "Unknown";
}
}
typedef struct _person {
char *name;
gender gen;
void (*set_name)(struct _person *receiver, char *name);
void (*set_gender)(struct _person *receiver, gender gen);
void (*print)(struct _person receiver);
} person;
void person_set_name(person *receiver, char *name);
void person_set_gender(person *receiver, gender gen);
void person_print(person receiver);
person*
new_person()
{
person *p = (person *)malloc(sizeof(person));
p->name = NULL;
p->gen = GENDER_UNKNOWN;
p->set_name = person_set_name;
p->set_gender = person_set_gender;
p->print = person_print;
return p;
}
void
free_person(person *p)
{
if (NULL != p)
{
free(p);
p = NULL;
}
}
void
person_set_name(person *receiver, char *name)
{
receiver->name = name;
}
void
person_set_gender(person *receiver, gender gen)
{
receiver->gen = gen;
}
void
person_print(person receiver)
{
printf("%s %s\n", receiver.name, gender_string(receiver.gen));
}
int
main(int argc, char* argv[])
{
person *p = new_person();
p->set_name(p, "kaneshin");
p->set_gender(p, GENDER_MALE);
p->print(*p);
free_person(p);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment