c生万物系列(封装)

为了对c语言进行封装,笔者参考了lw_oopc等开源库,决定使用宏对结构体进行封装。

先说一下大致思想:通过宏,结构体和文件来实现封装。

大概步骤:抽象出类-> 使用lw_oopc库进行封装->定义接口封装底层实现 ->main主函数调用接口 

顺便一提,笔者认为使用lw_oopc库最好在源文件,放在主函数会丧失封装性,放在头文件压根过不了编译器。在源文件实现后再大量定义接口。

以该文件为例,笔者将私有类放在源文件,然后在定义初始化的相关函数,比如initd(),这个函数隐藏了virtual_new函数,但是可以在头文件中声明,从而被调用,这就实现了接口。通过定义接口,可以选择提供的服务和细节,但是又可以隐藏内部实现。

在头文件中使用typedef进行重定义,可以达到模拟private的效果,但是除了不能直接访问该数据结构,并不影响定义指针然后分配内存。

至于public,直接在头文件中定义或者在main文件中定义就行了,这样可以直接访问内部成员。

不得不说,lw_oopc宏的用法十分新奇,笔者个人觉得提供了一种非常好的对象规范。

但是开源后随着不断更新和修改,在现在的新版本中,笔者甚至觉得有点臃肿了,不是十分好用。

让我们看看初始版本:

通过宏来写模板。c语言宏定义的本质是替换,可以看看下图,两者就是替换前后:

至此,封装的要素class,public,private已经大致实现,下一节笔者讲一讲继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu 14.04上安装和使用Memcache的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 随着您的网站的增长和流量的增加,最快显示压力的组件之一是后端数据库。如果您的数据库没有分布式和配置来处理高负载…

【常见开源库的二次开发】基于openssl的加密与解密——SHA算法源码解析(六)

目录 一、SHA-1算法分析: 1.1 Merkle Tree可信树 1.2 源码实现: 1.3 哈希计算功能 1.4 两种算法的区别: 1.4.1 目的 1.4.2 实现机制 1.4.3 输出 1.4.4 应用场景: 1.4 运行演示: 二、SHA-2算法分析: 2.1哈…

JavaScript 实现对象长度的获取

JavaScript 实现对象长度的获取 在 JavaScript 中,要获取对象的长度(即对象中属性的数量),可以使用以下几种方法: 使用 Object.keys():该方法返回一个对象自身(即不包括继承属性)可…

责任链模式的应用与解析

目录 责任链模式责任链模式结构责任链模式适用场景责任链模式优缺点练手题目题目描述输入描述输出描述题解 责任链模式 责任链模式,亦称职责链模式、命令链,是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每…

ffmpeg解析pcm文件进行播放

初始化音频子系统是使用 SDL 播放音频之前的一个必要步骤。这确保了 SDL 能够正确地配置和使用音频硬件。如果你不进行初始化,试图使用音频功能可能会导致未定义的行为或错误。 为什么需要初始化音频子系统? 1.资源分配: SDL 需要为音频设备分…

06-用户画像 + es映射+写入数据

es映射 创建用映射表 外部表删除时不会删除行数据,只删除元数据 内部表数据会全部删除 一下创建的是外部表 -- 创建映射表,指向es create external table db_ods.es_users(id int,username string,gender string )stored by org.elasticsearch.hadoop.h…

26.8 Django多表操作

1. 表关系 表关系在数据库中指的是表与表之间的连接和依赖关系. 这种关系定义了数据如何在不同的表之间进行交互和关联, 是实现数据一致性和完整性的重要手段.1.1 关系分类 多表关系在数据库中通常分为以下几种类型: * 1. 一对一(One-to-One)关系: 在数据库中, 这种关系通常通…

模拟建造游戏:城市:天际线2(都市天际线2)中文免安装,解压即撸

《城市:天际线2》(Cities: Skylines II)是一款模拟经营游戏,由Colossal Order开发,Paradox Interactive发行。 下载地址:https://pan.quark.cn/s/84e69332ec3e 更多游戏:https://kdocs.cn/l/cuH…

spring 中的属性解析器 PropertyResolver

我们知道,在 spring 中可以使用占位符,格式如 "${}",大括号中间放置待替换的占位符,待使用值时根据配置的属性解析器进行解析。但具体是如何操作的,且看本文来进行分析。 PropertyResolver 这是一个针对任…

基于Neo4j将知识图谱用于检索增强生成:Knowledge Graphs for RAG

Knowledge Graphs for RAG 本文是学习https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/这门课的学习笔记。 What you’ll learn in this course Knowledge graphs are used in development to structure complex data relationships, drive intelligent sea…

GDAL访问HDFS集群中的数据

1.集群搭建 参考文章:hadoop2.10.0完全分布式集群搭建 HA(QJM)高可用集群搭建_hadoop 2.10 ha-CSDN博客 创建文件夹 hdfs dfs -mkdir -p hdfs://192.168.80.132:9000/test 开放权限 hdfs dfs -chmod -R 777 /test 上传文件 hadoop fs -put /home/wh/data/res…

卡夫卡(Kafka)框架详解:从背景到应用实践

卡夫卡(Kafka)框架详解:从背景到应用实践 引言 在大数据和分布式系统日益普及的今天,数据处理和消息传递成为了支撑复杂业务系统的关键基础设施。Apache Kafka,作为一个高性能的分布式消息队列系统,因其高…

CSS技巧专栏:一日一例 11 -纯CSS实现多彩渐变按钮系列特效

CSS技巧专栏:一日一例 11 -纯CSS实现多彩渐变按钮系列特效 本篇,推荐给你几个按钮,先看一下图片 本例图片 案例分析 这是一个系列的按钮,它们具有共同的特点: 底层按钮层,具有一个彩色的渐变边框&#…

第十四章 数据库

第十四章 数据库 14.1 引言 数据存储在传统上是使用单独的没有关联的文件,称为平面文件 14.1.1 定义 定义:数据库是一个组织内被应用程序使用的逻辑相一致的相关数据的集合 14.1.2 数据库的优点 数据库的优点: 冗余少避免数据的不一致…

docker产生日志过大优化

1、Docker容器启动后日志存放位置 #cat /var/lib/docker/containers/容器ID/容器ID-json.log #echo >/var/lib/docker/containers/容器ID/容器ID-json.log临时清除日志 注:echo一个空进去,不需要重启容器,但如果你直接删除这个日志&…

【JavaEE】Bean的作用域和生命周期

一.Bean的作用域. 1.1 Bean的相关概念. 通过Spring IoC和DI的学习(不清楚的可以看的前面写过的总结,可以快速入门, http://t.csdnimg.cn/K8Xr0),我们知道了Spring是如何帮助我们管理对象的 通过 Controller , Service , Repository , Component , Configuration , Bean 来声明…

无人机之航拍高级操作与技巧

一、直线飞行与矩形飞行练习:通过直线和矩形路径的练习,提升飞行路径控制能力。 二、航点命令和事件编程:学习如何设置航点命令和事件,使无人机能够自动执行复杂任务。 三、故障诊断与处理:掌握基本的故障诊断方法和…

如何使用 API list 极狐GitLab 群组中的镜像仓库?

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

深入指南:VitePress 如何自定义样式

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Linux Shell——用awk计算相邻两行相减

如何用awk计算相邻两行相减 下面是将文件的第二列数据进行相邻两行相减的操作: awk NR1{tmp$2}NR>1{print $2-tmp;tmp$2} test.txt