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_nameAPI调用方式, 看起来有层次性- 我个人是比较推崇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开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 使用场景 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否…...
VSCode里玩转Qt Designer:手把手教你可视化设计PyQt5界面并自动生成Python代码
VSCode高效开发PyQt5:可视化设计与自动化代码生成实战 在Python GUI开发领域,PyQt5凭借其强大的功能和跨平台特性成为众多开发者的首选。然而,传统的手写界面布局代码不仅耗时耗力,还难以实时预览效果。本文将带你探索如何在VSCod…...
软件测试的V模型竟然是有争议的?——软件测评师题目拆解
不知道有多少同学在这个简单的题目栽过跟头,国内、国外对于V模型的定义是有出入的(习题在文末十二五规划教材《软件测试(第2版)佟伟光 主编》 一书中给出的V模型QT官方对应V模型的定义是这样的等级考试用书《软件测评师教程》第二…...
NOJ编程竞赛中的五大常见错误类型及高效调试技巧
1. NOJ编程竞赛错误类型全景解析 第一次参加NOJ在线编程竞赛时,看到满屏的WA、CE、RE、TE错误提示,我整个人都是懵的。直到后来在实战中踩过无数坑,才发现这些错误其实都有规律可循。最常见的五大错误类型就像编程路上的五个拦路虎࿰…...
3个步骤掌握InjectFix热修复核心方案
3个步骤掌握InjectFix热修复核心方案 【免费下载链接】InjectFix InjectFix is a hot-fix solution library for Unity 项目地址: https://gitcode.com/gh_mirrors/in/InjectFix 核心能力解析 🔧 原生方法修复:解决线上函数逻辑错误 解决什么问…...
智能排障:借助快马AI构建Vivado安装问题自动诊断与修复助手
作为一名FPGA开发者,Vivado安装过程中的各种报错简直是家常便饭。每次遇到新问题都要花大量时间搜索解决方案,效率实在太低。最近尝试用InsCode(快马)平台的AI能力搭建了一个智能诊断工具,效果出乎意料的好,分享下具体实现思路。 …...
深入BRPC的MPSC队列:为什么ExecutionQueue比传统队列更适合网络编程?
深入解析BRPC的MPSC队列:ExecutionQueue如何重塑网络编程任务调度 在网络编程的世界里,任务调度效率往往成为系统性能的瓶颈。传统队列在面对高并发网络请求时,常常因为锁竞争、内存分配等问题导致吞吐量下降。BRPC框架中的ExecutionQueue以…...
Jupyter Notebook文件损坏?3种方法快速恢复.ipynb中的代码(附Python脚本)
Jupyter Notebook文件损坏?3种方法快速恢复.ipynb中的代码(附Python脚本) 当你在深夜赶数据分析报告时突然断电,重启后发现Jupyter Notebook文件无法打开——这种绝望感每个数据工作者都懂。.ipynb文件损坏并非世界末日࿰…...
JavaScript金融计算中的精度陷阱与高精度解决方案
1. 金融计算中的精度灾难:从0.10.2≠0.3说起 如果你在Chrome控制台输入0.1 0.2,得到的不是预期的0.3,而是0.30000000000000004这个诡异的数字。我第一次在支付系统对接时遇到这个问题,差点因为几分钱的差额导致整个对账流程崩溃。…...
大模型学习进阶:收藏必备,小白程序员快速掌握RAG架构核心技术!
大模型学习进阶:收藏必备,小白程序员快速掌握RAG架构核心技术! 本文深入解析了RAG(检索增强生成)大模型的核心技术及其重要性,详细介绍了标准RAG、对话式RAG、纠正式RAG、自适应RAG、自我反思RAG、融合RAG、…...
从协议战争到SDN革命:华为数通技术演进中的那些关键抉择
从协议战争到SDN革命:华为数通技术演进中的关键抉择 在数据中心网络架构的演进历程中,技术路线的选择往往决定着企业未来十年的竞争力格局。当传统网络架构遭遇云计算时代的流量洪流,一场关于协议标准与技术范式的深刻变革悄然展开。这场变革…...
