c语言_实现类class的功能 实例-2.实例

时间:2024-03-02 12:14:40

目录结构:
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