016 - 如何写一个 C++ 类

news2025/9/16 9:50:00

到目前为止,我们学了类 class,本期我们要尝试着从头开始写一个类。

本期不会讲的太深。我们不会写非常复杂的类,我们要会完成一个基本的 log 类,来演示一下我们已经学过的相关知识。

接下来的几期,我们会继续学习类。并引入一些新的概念。所以你会看到从一个基本版本的类到一个做同样事情的更高级版本的类的过程和区别。它们是更为完整的代码。

让我们来开始写我们的 log 类。

为什么使用 log

首先我们先分析一下我们的需求,这个 log 类到底是什么?具体要完成什么功能?

这个 log 类是我们管理日志信息的一种方式,换句话说我们想要我们的程序打印消息或信息到控制台。这个通常对调试代码非常有帮助。

比如,在游戏或应用中,如果我们想知道发生了什么,你只需将事务的状态打印到控制台,因为应用程序中的控制台就像一个展示信息的地方,我们可以用它来打印出发生了什么。这也是几乎可以保证代码在正确工作的东西。

控制台基本上是内置在操作系统中的东西,所以我们几乎可以保证它不会出问题。

我很喜欢用 log 类作为例子,因为日志系统可以根据您的需要从简单的或复杂的都行,——有些日志系统非常复杂,甚至有可能有几千行代码,而这些仅仅是为了把东西打印到控制台。但它们对调试和开发非常重要,所以花点时间在这上面是值得的。

log 日志系统不仅可以做简单将信息打印到控制台这样的事情,也可以用不同颜色打印或是通过网络输出日志消息到一个文件,你可以做很多事情,你最终完成的 log 类十行到一万行代码都行。就是这样。

这就是为什么我会说 log 是一个很好的例子的原因。

以下我们分析需求

log 需要包括这些

log 类开始的时候非常简单,它提供向控制台写入文本的能力并保持某种日志级别,也就是我们真正想要发送给控制台的日志信息的级别,开始我们有三个层次错误 eror、警告 warning、信息 information。

我们将来可能我们的日志系统级别设置为警告 warning。这意味着只会打印警告和错误而不会打印跟踪消息。这是非常有用的。如果你不想看到一堆信息,你只想知道哪里出了问题或者你的警告是什么,同样通过过滤实际发送和打印的内容。控制台也会很清爽,

好了让我们来看看它会是什么样子

现在我们思考一下log类是如何工作的。——创建一个类或者设计API时,一个很好的方法是通过研究它的使用情况。

我们先进入main 函数输入我们可能会如何使用 log类的情况。

iEhXso.png

我们首先肯定是先实例化一个 log。然后,我们可能指定某种日志级别作为一个实际参数,暂且先跳过它。

log 肯定会设置一个 log 级别, SetLevel 方法的参数 LogLevelWarning 就是指 warning 级别,这意味着只有警告或更重要的信息,比如警告或错误,才会被打印出来。但不跟踪消息。

然后我可能想要打印一个警告信号。

通过以上模拟操作,现在我知道了我的 log 类大概是什么样子了,我们可以直接回去类中开始填空。

iEhBmA.png

这两个函数都是需要能够在外部访问的,所以我们设置它的可见性为 public。

首先是 SetLevel 函数,将 log 级别也就是 level 作为函数的整型参数,这样比较简单。然后这个函数会做一些事情。

然后还有一个 Warn 函数,它有一个 const char* 的参数,是我们的 message。const char* 就是字符串的意思,后面我们会专门有一期介绍字符串的内容,现在先知道这些就可以了。

我们现在还有一个问题,这几个函数都已经存在了,可是 LogLevelWarning 不存在,让我们开始声明 log 的级别变量。

我们创建一个私有的成员变量来保存我们的 log 级别的设定,它是一个整形,我把它叫做 M_LogLevel,——按照惯例我使用了M_作为前缀,这样可以提示我们这是一个私有的类成员变量,通过这样的方式当我在函数内部写代码时,我就能知道在类代码中哪些是成员变量哪些只是局部变量,当然这样的写法约定不是必须的,但是它确实对整理你的代码并保持代码干净很有帮助。特别是当你处理大型代码库和复杂类这样的东西时。所以我建议大家遵循这样的惯例。

顺便,我们快速地将 SetLevel 函数设置完成。在它里面将参数值赋值给成员变量 M_LogLevel。

iEhxyN.png

让我们回到 main中,处理 LogLevelWarning 这个地方。

我们前面已经规划好了,设为 2 的意思是信息(或者跟踪),1的意思是警告,0的意思是错误,直接这样设置的话,代码读起来有点困难,如果我写的代码是那样的话,读代码的时候会有很多疑问,什么是1?1是个啥?我会不知道它是什么意思,只能靠记忆来记住它代表什么意思,我不想这样处理这个问题。因此我们要创建一些变量,当它的值是某些值的时候表示我们想要表示的东西。

iEh7IV.png

我们在这里将它们设为公共 public 变量,你可以看到我在 log 类中用了两次 public,我喜欢把类中不同的部分分开来写,换句话说,public 方法可能在一个部分,然后 public 变量可以放在另一部分, public 静态变量可能会放在另一块中,这就是我的风格,你可以参考。

这些都是参数,所以我将它设置为 const int ,然后将 LogLevelWarning 设为1,我们还需要为错误写一个日志级别,LogLevelError 设置为零,然后我要为日志的信息跟踪再写一个 LogLevelInfo,让它等于2。

因此我们有三种类型的日志消息,我们有错误 Error、警告 warning、还有信息 information,默认情况下我会把我的日志级别设置为 LogLevelInfo,意思是把所有的东西都应该打印出来。

以上。

最后我们完善一下 Warn 函数,我希望我的 Warn 函数能够打印东西到控制台。

当然还要复制当前函数,创建我们的 Info版本和Error版本。

iEhEGd.png

我们现在有个问题。

我们当前的代码没有办法做到这个需求:如果日志级别设置成了 warning,就不要打印所有的 Info 消息。

我们可以通过添加 if 语句来搞定这个。

iEheqb.png

如果日志级别大于或等于这个特定的消息级别,那么就继续,Warn 和 Info方法也是一样的。然后我们将main函数中的 LogLevelWarning 调整为 log.LogLevelWarning。我们已经将 log 设置为警告级别。

运行我们的代码,看看具体的效果。

iEh6wq.png

我们打印出了警告信息。

我们试试打印 Info 信息和 Error 信息。

iEhF7z.png

没有问题,就是我们想的那样。

后话

我们实现了所有的目标,创造了一个非常基本的 log 类。

但是我想说这绝对不是我自己写 log 类的方式,因为有一些问题需要解决,一个经验丰富的程序员是不会这样写的,这不是特别完整的代码,但它是比较基础的代码,因为大家都是刚刚开始,所以我希望你们能够理解这些。

这样也给了我一个很好的机会和借口向你们展示,我们如何使用一些不同的概念来改进这个类以及为什么这是不完整的。

在接下来的几期中。我们会用更多的时间来了解C++的类,学习更多改善代码使其达到专业生产及水平的代码的方法。

本期就是这样,下期再见。

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

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

相关文章

银行数字化转型导师坚鹏:《银行业金融机构数据治理指引》

《银行业金融机构数据治理指引》 ——“监”听则明 护航银行高质量发展课程背景: 很多金融机构存在以下问题: 不清楚《银行业金融机构数据治理指引》出台背景? 不知道如何理解《银行业金融机构数据治理指引》相关规定? 不清楚…

重生之我是孔乙己——查找数组缺失元素的几种方法

💌 博客内容:查找缺失元素 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是…

【MySQL | 基础篇】03、MySQL 约束

目录 一、概述 二、约束演示 三、外键约束 3.1 介绍 3.2 语法 3.3 删除/更新行为 一、概述 概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类: 注意&#xff1a…

千耘农机导航的“星地一体”能力究竟是什么?

伴随农业机械化和智能化的发展,越来越多的人开始使用农机自动驾驶系统助力耕作,千耘农机导航的“星地一体”能力可有效解决信号受限的问题,实现作业提效。究竟什么是“星地一体”,又是如何解决智能化农机作业的痛点的?…

CTFHub | 00截断

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

Java模拟星空

目录 前言 JavaFX基础 1. GraphicsContext 2. AnimationTimer 代码实现 完整代码 前言 看了Python模拟星空很漂亮,Java也应该必须有一个! 环境:只需要JDK1.8就好!不需要外部包!!! Jav…

力扣-《剑指offer》-简单题

目录 第一题:05.替换空格 第二题:06.从尾到头打印链表 第三题:11.旋转数组的最小数字​编辑 第四题:17.打印从1到最大的n位数 第五题:29.顺时针打印矩阵 第六题:53.在排序数组中查找数字 第七题&#…

【C++】关于多线程,你应该知道这些

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉多线程相…

Python自动化测试 环境搭建 详解

一、安装Python环境: Python环境目前已被大部分主流操作系统所支持,比如在Linux、Mac、Unix等系统上就自带了Python环境,但在Windows系统上目前还需要自己安装。 1、下载Python Python下载地址:https://www.python.org/downloads…

Flink 1.14测试cdc写入到kafka案例

测试案例 1、遇到的问题 1.1 bug1 io.debezium.DebeziumException: Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation Error code: 1227; SQLSTATE: 42000.at io.debezium.connector.mysql.MySqlStreamingChangeEventSour…

网络编程(第一章:网络基础)

文章目录一. 网络基础1.2 联网协议和层1.2.1 网络采用分层的思想1.2.2 OSI体系结构(重点!!)1.2.3 TCP/IP协议1.2.3.1 网络接口与物理层1.2.3.2 网络层1.2.3.3 传输层1.2.3.4 应用层1.2.4 网络封包与拆包1.3 TCP和UDP的异同点(重点…

【活动】高效学习方法分享

1 写在前面 当今社会,学习已成为每个人不可避免的事情。无论是在校生还是职场人士,我们都需要不断地更新自己的知识和技能。而如何高效地学习,则成为了许多人迫切需要解决的问题。本文将分享一些高效学习方法,帮助你更快、更好地…

Redis学习笔记之(Redis认识、安装、启动、命令行客户端、图形化界面)

目录 初识Redis 认识NOSQL认识Redis安装Redis Redis常见命令 5种常见数据结构通用命令不同数据结构的操作命令 Redis的Java客户端 Jedis客户端SpringDataRedis客户端 认识NOSQL 认识NoSQL SQLNoSQL数据结构结构化(Structured)非结构化数据关联关联的(Relational)无关联…

Symble

ES6引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。 Symbol特点 Symbol 的值是唯一的,用来解决命名冲突的问题 Symbol值不能与其他数据进行运算 Symbol定义的对…

SadTalker项目上手教程

背景 最近发现一个很有趣的GitHub项目SadTalker,它能够将一张图片跟一段音频合成一段视频,看起来毫无违和感,如果不仔细看,甚至很难辨别真假,预计未来某一天,一大波网红即将失业。 虽然这个项目目前的主要…

基于 DSP+FPGA+1553B总线的水下信息融合系统的设计

在一个大型水下系统中,针对不同分系统的特 性,通常采用不同的通信协议。串行通信具有抗干扰 能力强,传输距离远等特点,适用于需要远距离通信 的分系统;MIL-STD-1553B 总线在传输方面具有极强 的可靠性和实时性&#xf…

关于“复活节Easter”知识,你了解多少?

复活节是基督教纪念耶稣复活的节日。耶稣被钉死在十字架上,死后第三天复活。Christians say Jesus died on Friday. On the third day, he rose from the dead. He became alive again. 复活节定在每年春分月圆之后第一个星期日举行。因为春分之后日照时间比较长&am…

《菲波那契凤尾》:菲波那契数列,返回最后6位

目录 一、题目 二、思路 1、斐波那契数列 2、返回最后6位 三、代码 详细注释版本: 简化注释版本: 一、题目 菲波那契凤尾 题目链接:菲波那契凤尾 NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。为了考验他&#xff0c…

【实用篇】SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud分布式

文章目录一、服务拆分1.1 服务拆分Demo1.2 微服务远程调用二、Eureka2.1 Eureka原理2.2 Eureka-server服务搭建2.3 eureka-client服务注册2.4 eureka-client服务复制2.5 eureka服务发现三、Ribbon负载均衡3.1 负载均衡原理3.2 负载均衡策略3.3 自定义负载均衡策略3.4 饥饿加载与…

每日学术速递4.12

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.HC 随着新的“生成代理”论文的发布,LLM刚刚达到了一个重要的里程碑——通过使用 LLM,生成代理能够在受《模拟人生》启发的交互式沙箱中模拟类人行为。代理架构扩展…