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

1.需求与背景

使用C++ , python语言久了, 发现 类 class写代码逻辑更方便, 简洁. 封装的API更加易用;
内核代码中, 也经常看到类似类的封装. 自己尝试实现一个C语言类的功能

2.实例

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

3.总结

  1. 调用类的成员函数, 都要带一个类的指针
    1. 类似C++ 的 this , python 的 self
    2. 如果这个事情交给编译器做, 编码会快乐,简单一点
  2. get_name = static _get_name 封装形式, 提高API 简洁性
  3. class_A_get_nameclass_A.get_name 相比, class_A.get_name API调用方式, 看起来有层次性
    1. 我个人是比较推崇c with class
    2. 也支持未来c语法, 支持类class的语法
  4. C语言支持类的实现; 但C++/python 原生支持类的编写, 编码更简易方便
  5. 目前C++在项目中只使用了1年, 很多C++语法还不了解, 自认C++属于c with class的水平, 但感觉C++开发挺好用的, 没有大家说的那么难用.
    1. 只是c/c++的内存问题, 确实遇到很多次, 前期开发有遇到, 项目中期一些场景, 特定条件下也会有.
    2. 虽然本人熟悉gdb, valgrind可以快速定位排查内存问题, 但也要花费时间debug, 排雷踩坑, 也经常怀疑自己为什么会犯这个错.
  6. 大胆猜测, C++创始人 写了很多这种代码与封装API, 才发明C++, 原生支持类的语法

相关推荐

  1. c语言_实现class功能 实例

    2024-02-09 14:36:03       54 阅读
  2. C语言实现toupper函数功能

    2024-02-09 14:36:03       51 阅读
  3. React查询、搜索功能实现

    2024-02-09 14:36:03       59 阅读
  4. React查询、搜索功能实现

    2024-02-09 14:36:03       55 阅读
  5. C语言实现计算器功能

    2024-02-09 14:36:03       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 14:36:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 14:36:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 14:36:03       82 阅读
  4. Python语言-面向对象

    2024-02-09 14:36:03       91 阅读

热门阅读

  1. 贪心_分类讨论_边界问题_1921_C. Sending Messages

    2024-02-09 14:36:03       48 阅读
  2. c实现链表

    2024-02-09 14:36:03       41 阅读
  3. deepin20.9安装及配置

    2024-02-09 14:36:03       46 阅读
  4. 高精度加法 取余 分类讨论 AcWing 791. 高精度加法

    2024-02-09 14:36:03       48 阅读
  5. 【LeetCode每日一题】1122. 数组的相对排序

    2024-02-09 14:36:03       54 阅读
  6. LeetCode639. Decode Ways II——动态规划

    2024-02-09 14:36:03       41 阅读
  7. C++ .h文件类的调用

    2024-02-09 14:36:03       51 阅读
  8. 机器学习原理到Python代码实现之PolynomialRegression

    2024-02-09 14:36:03       42 阅读
  9. List 差集

    2024-02-09 14:36:03       39 阅读
  10. 侵入式智能指针和非侵入式智能指针

    2024-02-09 14:36:03       44 阅读