当前位置: 首页 > news >正文

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.总结

  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++, 原生支持类的语法

相关文章:

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&#xff0c;这里是肆十二&#xff0c;好久不见&#xff0c;大家&#xff01; 新年好&#xff01; pip是Python的包管理工具&#xff0c;它可以用来安装、升级、卸载Python包。以下是一些常用的pip指令&#xff1a; 安装包&#xff1a; bash复制代码…...

【Java EE初阶十二】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…...

Idea Git Review插件

idea git plugin 添加了一些常用的小插件 可以右键打开git bash窗口 可以右键选中文字点击baidu fanyi 可以通过搜索git用户名 指定开始时间查询某个版本自己提交的所有代码文件 可以通过点击蓝色行数&#xff0c;跳转到指定的改动代码块 资源地址&#xff1a; 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 的直接替代品&#xff0c;与本地推理的 OpenAI API 规范兼容。 它无需 GPU&#xff0c;还有多种用途集成&#xff0c;允许您使用消费级硬件在本地或本地运行 LLM、生成图像、音频等等&#…...

Swift Combine 管道 从入门到精通三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据&#xff0c;操作符对该数据做出响应并有可能更改它&#xff0c;订阅者请求并接收这些数据。 这…...

【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(二)-函数列表

目录 表3-1&#xff1a;定点滤波器功能 表3-2&#xff1a;定点快速傅里叶变换&#xff08;FFT&#xff09;函数 表3-3&#xff1a;定点数学函数 表3-4&#xff1a;定点三角函数 表3-5&#xff1a;定点向量函数 表3-6&#xff1a;定点矩阵函数 表3-7&#xff1a;浮点滤波…...

蓝桥杯(Web大学组)2022国赛真题:水果消消乐

思路&#xff1a; 记录点击次数&#xff0c;点击次数为1时&#xff0c;记录点击下标&#xff08;用于隐藏or消除&#xff09;、点击种类&#xff0c;点击次数为2时&#xff0c;判断该下标所对应种类与第一次是否相同 相同&#xff1a;两个都visibility:hidden &#xff08;占…...

LeetCode--代码详解 155.最小栈

155.最小栈 题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 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 跨平台开发&#xff1a;Uniapp可以同时开发多个平台的应用&#xff0c;只需编写一套代码即可。开发者可以通过编写Vue组件来构建界面&#xff0c;通过编写JavaScript代码来实现业务逻辑。 页面和组件&#xff1a;Uniapp的页面和组件都是基于Vue组件的&#xff…...

CDN缓存404、403状态码

可以参考一下&#xff1a;浏览器缓存和 CDN 在前端的落地 事故记录&#xff1a; 前端发版时存在新旧两个容器&#xff0c;在资源替换的间隙&#xff0c;用户请求到的肯定是新容器的html文件&#xff0c;但是根据新容器的html向新静态资源发起请求&#xff0c;此时旧容器还没有…...

【Python网络编程之DHCP服务器】

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

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…...

CSP-动态规划-最长公共子序列(LCS)

一、动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;主要用于求解可以被分解为相似子问题的复杂问题&#xff0c;特别是在优化问题上表现出色&#xff0c;如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…...

安装nodejs2011并配置npm仓库

1. 安装nodejs 选择2011版本下载 在安装目录(个人情况)下 D:\Program Files\nodejs2011创建2个文件夹&#xff1a; node_global &#xff08;依赖库&#xff09; node_cache &#xff08;缓存&#xff09; 然后在当前目录下cmd进入dos窗口&#xff0c;执行&#xff1a; npm c…...

排序C++代码(已更:快速排序,归并排序)

一、快速排序 #include<iostream> using namespace std;//设定三个数组&#xff0c;判断排序算法代码的正确性 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

正文共&#xff1a;1333 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境&#xff08;TensorFlow识别GPU难道就这么难吗&#xff1f;还是我的GPU有问题&#xff1f;&#xff09;&#xff0c;但是失败了。考虑到Windows…...

Java设计模式——策略

前言 策略模式是平时Java开发中常用的一种&#xff0c;虽然已有很多讲解设计模式的文章&#xff0c;但是这里还是写篇文章来从自己理解的角度讲解一下。 使用场景 我们不妨进行场景假设&#xff0c;要对我们的软件进行授权管理&#xff1a;在启动我们的软件之前先要校验是否…...

VSCode里玩转Qt Designer:手把手教你可视化设计PyQt5界面并自动生成Python代码

VSCode高效开发PyQt5&#xff1a;可视化设计与自动化代码生成实战 在Python GUI开发领域&#xff0c;PyQt5凭借其强大的功能和跨平台特性成为众多开发者的首选。然而&#xff0c;传统的手写界面布局代码不仅耗时耗力&#xff0c;还难以实时预览效果。本文将带你探索如何在VSCod…...

软件测试的V模型竟然是有争议的?——软件测评师题目拆解

不知道有多少同学在这个简单的题目栽过跟头&#xff0c;国内、国外对于V模型的定义是有出入的&#xff08;习题在文末十二五规划教材《软件测试&#xff08;第2版&#xff09;佟伟光 主编》 一书中给出的V模型QT官方对应V模型的定义是这样的等级考试用书《软件测评师教程》第二…...

NOJ编程竞赛中的五大常见错误类型及高效调试技巧

1. NOJ编程竞赛错误类型全景解析 第一次参加NOJ在线编程竞赛时&#xff0c;看到满屏的WA、CE、RE、TE错误提示&#xff0c;我整个人都是懵的。直到后来在实战中踩过无数坑&#xff0c;才发现这些错误其实都有规律可循。最常见的五大错误类型就像编程路上的五个拦路虎&#xff0…...

3个步骤掌握InjectFix热修复核心方案

3个步骤掌握InjectFix热修复核心方案 【免费下载链接】InjectFix InjectFix is a hot-fix solution library for Unity 项目地址: https://gitcode.com/gh_mirrors/in/InjectFix 核心能力解析 &#x1f527; 原生方法修复&#xff1a;解决线上函数逻辑错误 解决什么问…...

智能排障:借助快马AI构建Vivado安装问题自动诊断与修复助手

作为一名FPGA开发者&#xff0c;Vivado安装过程中的各种报错简直是家常便饭。每次遇到新问题都要花大量时间搜索解决方案&#xff0c;效率实在太低。最近尝试用InsCode(快马)平台的AI能力搭建了一个智能诊断工具&#xff0c;效果出乎意料的好&#xff0c;分享下具体实现思路。 …...

深入BRPC的MPSC队列:为什么ExecutionQueue比传统队列更适合网络编程?

深入解析BRPC的MPSC队列&#xff1a;ExecutionQueue如何重塑网络编程任务调度 在网络编程的世界里&#xff0c;任务调度效率往往成为系统性能的瓶颈。传统队列在面对高并发网络请求时&#xff0c;常常因为锁竞争、内存分配等问题导致吞吐量下降。BRPC框架中的ExecutionQueue以…...

Jupyter Notebook文件损坏?3种方法快速恢复.ipynb中的代码(附Python脚本)

Jupyter Notebook文件损坏&#xff1f;3种方法快速恢复.ipynb中的代码&#xff08;附Python脚本&#xff09; 当你在深夜赶数据分析报告时突然断电&#xff0c;重启后发现Jupyter Notebook文件无法打开——这种绝望感每个数据工作者都懂。.ipynb文件损坏并非世界末日&#xff0…...

JavaScript金融计算中的精度陷阱与高精度解决方案

1. 金融计算中的精度灾难&#xff1a;从0.10.2≠0.3说起 如果你在Chrome控制台输入0.1 0.2&#xff0c;得到的不是预期的0.3&#xff0c;而是0.30000000000000004这个诡异的数字。我第一次在支付系统对接时遇到这个问题&#xff0c;差点因为几分钱的差额导致整个对账流程崩溃。…...

大模型学习进阶:收藏必备,小白程序员快速掌握RAG架构核心技术!

大模型学习进阶&#xff1a;收藏必备&#xff0c;小白程序员快速掌握RAG架构核心技术&#xff01; 本文深入解析了RAG&#xff08;检索增强生成&#xff09;大模型的核心技术及其重要性&#xff0c;详细介绍了标准RAG、对话式RAG、纠正式RAG、自适应RAG、自我反思RAG、融合RAG、…...

从协议战争到SDN革命:华为数通技术演进中的那些关键抉择

从协议战争到SDN革命&#xff1a;华为数通技术演进中的关键抉择 在数据中心网络架构的演进历程中&#xff0c;技术路线的选择往往决定着企业未来十年的竞争力格局。当传统网络架构遭遇云计算时代的流量洪流&#xff0c;一场关于协议标准与技术范式的深刻变革悄然展开。这场变革…...