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