c语言_实现类class的功能 实例
c语言_实现类class的功能 实例
- 1.需求与背景
- 2.实例
- 1.类的头文件 class_A.h
- 2.类的实现 class_A.c
- 3.引用
- 4.编译与运行
- 3.总结
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.总结
- 调用类的成员函数, 都要带一个类的指针
- 类似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++, 原生支持类的语法
相关文章:
c语言_实现类class的功能 实例
c语言_实现类class的功能 实例 1.需求与背景2.实例1.类的头文件 class_A.h2.类的实现 class_A.c3.引用4.编译与运行 3.总结 1.需求与背景 使用C , python语言久了, 发现 类 class写代码逻辑更方便, 简洁. 封装的API更加易用; 内核代码中, 也经常看到类似类的封装. 自己尝试实现…...

[2024]常用的pip指令
[2024]常用的pip指令 HI,这里是肆十二,好久不见,大家! 新年好! pip是Python的包管理工具,它可以用来安装、升级、卸载Python包。以下是一些常用的pip指令: 安装包: bash复制代码…...

【Java EE初阶十二】网络编程TCP/IP协议(二)
1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类: 1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号 2、Socket…...

Idea Git Review插件
idea git plugin 添加了一些常用的小插件 可以右键打开git bash窗口 可以右键选中文字点击baidu fanyi 可以通过搜索git用户名 指定开始时间查询某个版本自己提交的所有代码文件 可以通过点击蓝色行数,跳转到指定的改动代码块 资源地址: git-pl…...
python的turtle可以定义多个海龟对象
import turtle as t t.color(purple) t.right(10) t.fd(100) t1 t.Turtle() #t1.color(red) t1.left(10) t1.fd(100) t2 t.Turtle() #t2.color(green) t2.left(20) t2.fd(100) t3 t.Turtle() #t3.color(blue) t3.left(30) t3.fd(100) python的turtle可以定义多个海龟对象…...

LocalAI 部署(主要针对 mac m2 启动)
LocalAI 部署 介绍 LocalAI 是免费的开源 OpenAI 替代方案。 LocalAI 充当 REST API 的直接替代品,与本地推理的 OpenAI API 规范兼容。 它无需 GPU,还有多种用途集成,允许您使用消费级硬件在本地或本地运行 LLM、生成图像、音频等等&#…...

Swift Combine 管道 从入门到精通三
Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据,操作符对该数据做出响应并有可能更改它,订阅者请求并接收这些数据。 这…...
【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(二)-函数列表
目录 表3-1:定点滤波器功能 表3-2:定点快速傅里叶变换(FFT)函数 表3-3:定点数学函数 表3-4:定点三角函数 表3-5:定点向量函数 表3-6:定点矩阵函数 表3-7:浮点滤波…...

蓝桥杯(Web大学组)2022国赛真题:水果消消乐
思路: 记录点击次数,点击次数为1时,记录点击下标(用于隐藏or消除)、点击种类,点击次数为2时,判断该下标所对应种类与第一次是否相同 相同:两个都visibility:hidden (占…...
LeetCode--代码详解 155.最小栈
155.最小栈 题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…...
第6讲后端鉴权拦截器实现
后端鉴权拦截器实现 package com.java1234.interceptor;import com.java1234.util.JwtUtils; import com.java1234.util.StringUtil; import io.jsonwebtoken.Claims; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerI…...
uniapp从入门到进阶
一、了解uniapp 跨平台开发:Uniapp可以同时开发多个平台的应用,只需编写一套代码即可。开发者可以通过编写Vue组件来构建界面,通过编写JavaScript代码来实现业务逻辑。 页面和组件:Uniapp的页面和组件都是基于Vue组件的ÿ…...
CDN缓存404、403状态码
可以参考一下:浏览器缓存和 CDN 在前端的落地 事故记录: 前端发版时存在新旧两个容器,在资源替换的间隙,用户请求到的肯定是新容器的html文件,但是根据新容器的html向新静态资源发起请求,此时旧容器还没有…...

【Python网络编程之DHCP服务器】
🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之DHCP服务器 代码见资源,效果图如下一、实验要求二、协议原理2.1 D…...

【MySQL】:深入理解并掌握DML和DCL
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…...

CSP-动态规划-最长公共子序列(LCS)
一、动态规划 动态规划(Dynamic Programming,简称DP)主要用于求解可以被分解为相似子问题的复杂问题,特别是在优化问题上表现出色,如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…...
安装nodejs2011并配置npm仓库
1. 安装nodejs 选择2011版本下载 在安装目录(个人情况)下 D:\Program Files\nodejs2011创建2个文件夹: node_global (依赖库) node_cache (缓存) 然后在当前目录下cmd进入dos窗口,执行: npm c…...
排序C++代码(已更:快速排序,归并排序)
一、快速排序 #include<iostream> using namespace std;//设定三个数组,判断排序算法代码的正确性 int a[100]{3,4,2,6,9,7,1,0,1,2,3,3,5,6,7,8,3,4,5}; int b[100]{1,5,3,4}; int c[100]{7,8,9,1,2,3};void quickSort(int* num,int l,int r){if(l>r) re…...

CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN
正文共:1333 字 21 图,预估阅读时间:2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境(TensorFlow识别GPU难道就这么难吗?还是我的GPU有问题?),但是失败了。考虑到Windows…...
Java设计模式——策略
前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 使用场景 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...