目录结构:
main.c class_A.c class_A.h
1.类的头文件 class_A.h
class_A.h
#pragma once
#ifndef __class_A_h__
#define __class_A_h__
typedef struct {
int age;
char name[32];
int (*get_age)();
char* (*get_name)();
}class_A;
int class_A_init(class_A* self, int age, char* name);
void class_A_destroy(class_A* self);
class_A* new_class_A(int age, char* name);
void free_class_A(class_A* self);
#endif
2.类的实现 class_A.c
class_A.c
#include <string.h>
#include <stdlib.h>
#include "class_A.h"
static int _get_age(class_A* self) {
return self->age;
};
static char* _get_name(class_A* self) {
return self->name;
};
int class_A_init(class_A* self, int age, char* name)
{
self->age = age;
memcpy(self->name, name, sizeof(self->name) - 1);
self->get_age = _get_age;
self->get_name = _get_name;
return 0;
}
void class_A_destroy(class_A* self)
{
}
class_A* new_class_A(int age, char* name)
{
class_A* p = malloc(sizeof(class_A));
if (p == NULL)
return NULL;
class_A_init(p, age, name);
return p;
}
void free_class_A(class_A* self)
{
class_A_destroy(self);
free(self);
self = NULL;
}
3.引用
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "class_A.h"
int main()
{
// 栈-局部变量方式
class_A a;
class_A_init(&a,18,"lili");
printf("a name=%s, age=%d\n", a.get_name(&a), a.get_age(&a));
class_A_destroy(&a);
// 堆-申请内存方式
class_A* b = new_class_A(19, "Malike");
if (b) {
printf("b name=%s, age=%d\n", b->get_name(b), b->get_age(b));
free_class_A(b);
}
return 0;
}
4.编译与运行
gcc main.c class_A.c
./a.out
a name=lili, age=18
b name=Malike, age=19