Skip to content

Instantly share code, notes, and snippets.

@Bloody-Badboy
Created March 10, 2018 15:13
Show Gist options
  • Save Bloody-Badboy/df18cf36fc4eb528c718d53916be8b83 to your computer and use it in GitHub Desktop.
Save Bloody-Badboy/df18cf36fc4eb528c718d53916be8b83 to your computer and use it in GitHub Desktop.
C Function Pointer Example
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct _user_ User;
struct _user_ {
char *first_name;
char *last_name;
char *email;
void (*setFirstName)(User *self, const char *first_name);
void (*setLastName)(User *self, const char *last_name);
void (*setEmail)(User *self, const char *email);
void (*display)(User *self);
};
static void user_display(User *user) {
printf("[*] Full Name: %s %s\n[*] Email: %s\n", user->first_name, user->last_name, user->email);
}
static void user_setFirstName(User *self, const char *first_name) {
self->first_name = malloc((strlen(first_name) + 1) * sizeof(char));
strcpy(self->first_name, first_name);
}
static void user_setLastName(User *self, const char *last_name) {
self->last_name = malloc((strlen(last_name) + 1) * sizeof(char));
strcpy(self->last_name, last_name);
}
static void user_setEmail(User *self, const char *email) {
self->email = malloc((strlen(email) + 1) * sizeof(char));
strcpy(self->email, email);
}
User *new_User() {
User *user = malloc(sizeof(User));
user->setFirstName = &user_setFirstName;
user->setLastName = &user_setLastName;
user->setEmail = &user_setEmail;
user->display = &user_display;
return user;
}
void user_destroy(User *user) {
free(user->first_name);
free(user->last_name);
free(user->email);
free(user);
}
int main() {
User *user = new_User();
user->setFirstName(user, "John");
user->setLastName(user, "Smith");
user->setEmail(user, "[email protected]");
user->display(user);
user_destroy(user);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment