C++—18、C++ 中如何写类

news2025/1/17 10:59:56

一、类的功能阐述

今天我们将用目前学到的类的基础知识从头开始编写一个类。只编写一个基本的Log类,来演示到目前为止我们学过的一些基本特性。随着接下来的学习你会看到从一个类的基本版本到一个更高级版本的过程和区别。高级版本可以做同样的事情,但可以被认为是更好的代码。

我们来创建一个Log类,这个类是用来管理日志信息的一种方式,也就是把我们想要的信息打印到控制台上。这一般在调试程序时很有用。在我们程序中,如果你想知道发生了什么,只需要把事物的状态打印到控制台就行了。因为应用程序的控制台就像一个信息转储的地方,我们可以用它来显示发生了什么。

在游戏应用中如果我们要显示一个图形或者其他东西,这有时候会出问题,比如说图形渲染系统出问题了,或者其他的问题,我们就没法得到这些信息了。然而控制台是内置在操作系统的程序,所以我们几乎可以保证它总是能正常工作的。

我们来开始编写Log类,这里很简单,只是实现了向控制台发送文本的功能。而且可以控制我们发送给控制台日志信息的级别。最开始我们有三个级别。有error,warning和message(或者叫trace),简单来说,如果我们把日志级别设置为warning,那么只有warning和error级别的日志信息能打印出来,trace(或称为message)级别的不行。如果你只想看程序报了什么错或者有什么警告,这样设置是很有用的,不用看到一大堆无用的信息。通过过滤发送和打印的内容可以让控制台很清爽。

二、类的创建步骤

1、先创建一个Log类,

class Log

{

};

int main()

{

std::cin.get();

}

2、先写类的使用情况,就是我们打算用这个类干什么

现在先想一下Log类是如何工作的,创建一个类或者设计一个API很好的方式是研究它的使用情况。接下来进入main函数,开始编写我如何使用Log类。

class Log

{

};

int main()

{

Log log;//首先实例化一个Log类。

log.SetLevel(LogLevelWarning);//设置log级别,比如LogLevelWarning是指warning级别。这

//意味着只有警告(warning)或者错误(error)信息才会打印出来,trace信息不会。

log.warn(“”);//我要打印的警告信息是“”

std::cin.get();

}

3、完善类的成员函数及成员变量

通过上面log功能使用情况,我们就会知道我的Log类需要哪些功能了,让我们回过头去实现它们。

我们先实现外部能访问的方法,这个肯定是public的。

class Log

{

public:

void SetLevel(int level)

{

}

void warn( const char* message) //warn函数有一个字符串指针,是我们要打印的消息。

{

}

};

int main()

{

Log log;//首先实例化一个Log类。

log.SetLevel(LogLevelWarning);//设置log级别,比如LogLevelWarning是指warning级别。这

//意味着只有警告(warning)或者错误(error)信息才会打印出来,trace信息不会。

log.warn(“”);//我要打印的警告信息是“”

std::cin.get();

}

这里对于const char *message;

定义一个指向字符常量的指针,这里,message是一个指向 char* 类型的常量,所以不能用message来修改所指向的内容,换句话说,*message的值为const,不能修改。但是message的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对message而言,这个值是常量。

程序运行查看结果:

这里的LogLevelWarning是不存在的,让我们声明log level变量,接下来我们将创建一些私有变量,代表我们的log级别。

#include<iostream>
#define log(x) std::cout<<x<<std::endl
class Log
{
private:
	int m_loglevel;//声明日志级别这个成员变量
public:
	void SetLevel(int level)//设置日志级别
	{
		m_loglevel = level;//把局部变量赋值给成员变量
	}
	void Warn(const char* message)//输出警告信息
	{

	}

};
int main()
{
	Log log;
	log.SetLevel(LogLevelWarning);
	log.Warn("warningmessage");


	std::cin.get();

}

为了让级别好记,比如LogLevelWarning,我们可以把它们设置成公有变量。

这里注意变量和方法分开,即使是相同的public,同样public static变量放在另一部分。

我们有三种日志级别,默认情况下为LogLevelInfo。

#include<iostream>
#define log(x) std::cout<<x<<std::endl
class Log
{
public:
	const int LogLevelError = 0;
	const int LogLevelWarning = 1;//定义LogLevelWarning为常量,数值为1.
	const int LogLevelError = 0;
	const int LogLevelInfo = 2;
private:
	int m_loglevel=LogLevelInfo;//声明日志级别这个成员变量,并赋初值。
public:
	void SetLevel(int level)//设置日志级别
	{
		m_loglevel = level;//把局部变量赋值给成员变量
	}
	void Warn(const char* message)//输出警告信息
	{

	}

};
int main()
{
	Log log;
	log.SetLevel(LogLevelWarning);
	log.Warn("warningmessage");


	std::cin.get();

}

最后我们来完善Warn函数,我们希望这个成员函数能打印信息到控制台,同时打印这条信息的级别。

#include<iostream>
#define log(x) std::cout<<x<<std::endl
class Log
{
public:
	const int LogLevelError = 0;
	const int LogLevelWarning = 1;//定义LogLevelWarning为常量,数值为1.
	const int LogLevelInfo = 2;
private:
	int m_loglevel=LogLevelInfo;//声明日志级别这个成员变量,并赋初值。
public:
	void SetLevel(int level)//设置日志级别
	{
		m_loglevel = level;//把局部变量赋值给成员变量
	}
	void Warn(const char* message)//输出警告信息
	{
		if(m_loglevel>= LogLevelWarning)
		std::cout<<"[warning]"<< message << std::endl;
	}
	void Info(const char* message)//输出警告信息
	{
		if (m_loglevel >= LogLevelInfo)
			std:: cout<< "[Info]" << message << std::endl;
	}
	void Error(const char* message)//输出警告信息
	{
		if (m_loglevel >= LogLevelError)
		std::cout << "[Error]" << message << std::endl;
	}

};
int main()
{
	Log log;
	log.SetLevel(log.LogLevelWarning);
	log.Warn("warningmessage");
	log.Info("warningmessage");
	log.Error("warningmessage");
		std::cin.get();
}

测试没有问题。

4、要注意的问题

要注意的是LogLevelWarning是在类的内部定义的,我们使用的时候要加上log。

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

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

相关文章

SW - 查看装配图中的零件的全路径名称

文章目录 SW - 查看装配图中的零件的全路径名称概述笔记END SW - 查看装配图中的零件的全路径名称 概述 装配图中&#xff0c;如果本机有多个不同版本的同名零件(e.g. v1/p1零件, v2/p1零件)&#xff0c;在装配图中想确认是哪个版本的零件。 如果编辑错了文件&#xff0c;或者…

【开源分享】nlohmann C++ JSON解析库

文章目录 1. Nlohmann JSON 库介绍2. 编译和使用2.1 获取库2.2 包含头文件2.3 使用示例2.4 编译 3. 优势4. 缺点5. 总结参考 1. Nlohmann JSON 库介绍 Nlohmann JSON 是一个用于 C 的现代 JSON 库&#xff0c;由 Niels Lohmann 开发。它以易用性和高性能著称&#xff0c;支持 …

神经网络基础-正则化方法

文章目录 1. 什么是正则化2. 正则化方法2.1 Dropout正则化2.2 批量归一化(BN层) 学习目标&#xff1a; 知道正则化的作用掌握随机失活 DropOut 策略知道 BN 层的作用 1. 什么是正则化 在设计机器学习算法时希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小…

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

w~Transformer~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍&#xff01;字节跳动开源8比特混合精度Transformer引擎,近年来&#xff0c;Transformer 已经成为了 NLP 和 CV 等领域的主流模型&#xff0c;但庞大的模型参数限制了它的高效训练和推理。…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码&#xff0c;将远程的6006端口代理到本地 在服务器终端&#xff0c;激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…

网站建设公司哪家好?我的避坑指南

公司刚成立那个时候&#xff0c;第一步就是想着抓紧做一个官网&#xff0c;因为一个好的网站可以通过互联网源源不断的带来客流&#xff0c;所以小公司业务最重要&#xff0c;我就赶紧在网上开始找公司。 网站是的大活&#xff0c;对于我这种什么都不会的&#xff0c;当然只能…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…

qml RadialGradient详解

1、概述 RadialGradient是QML中用于创建径向渐变效果的一种类型。它允许您定义从中心向外辐射的颜色渐变&#xff0c;可以应用于各种QML可视组件上&#xff0c;如Rectangle、Image等&#xff0c;以创建出丰富的视觉效果。 2、重要属性 angle&#xff1a;定义渐变围绕其中心点…

链表 -- 反转链表,k个一组翻转链表,两两交换链表中结点

目录 反转链表 题目 ​编辑 分析 代码 k个一组翻转链表 题目 分析 代码 两两交换链表中的结点 题目 ​编辑 分析 代码 反转链表 题目 分析 反转过程: newhead作为遍历指针,最终停在尾结点上prev保存上一个结点,通过改变newhead和prev的连接来实现反转(核心)通过ne…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

统计学习算法——决策树

内容来自B站Up主&#xff1a;风中摇曳的小萝卜https://www.bilibili.com/video/BV1ar4y137GD&#xff0c;仅为个人学习所用。 问题引入 有15位客户向某银行申请贷款&#xff0c;下面是他们的一些基本信息&#xff0c;类别列表示是否通过贷款申请&#xff0c;是表示通过贷款申…

疫苗预约小程序ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…

Linux的常用命令(三)

目录 六、网络通信命令 1.网络通信命令ping 2.网络通信命令ifconfig 七、系统命令 1. 系统命令shutdown 2. 系统命令reboot 八、vi编辑器 六、网络通信命令 1.网络通信命令ping 命令名称&#xff1a;ping 命令所在路径&#xff1a;/usr/sbin/ping 执行权限&#xff…

CryptoMamba:利用状态空间模型实现精确的比特币价格预测

“CryptoMamba: Leveraging State Space Models for Accurate Bitcoin Price Prediction” 论文地址&#xff1a;https://arxiv.org/pdf/2501.01010 Github地址&#xff1a;https://github.com/MShahabSepehri/CryptoMamba 摘要 预测比特币价格由于市场的高波动性和复杂的非线…

【图表示例】元素-边-01

G6A Graph Visualization Framework in JavaScripthttps://g6.antv.antgroup.com/zh/examples/element/edge/#line 项目的创建参考 G6 详细教程&#xff0c;注意&#xff0c;node版本需要&#xff1a;required: { node: >18 }G6A Graph Visualization Framework in JavaScri…

永磁同步电机参数辨识算法--变增益MRAS方法在线辨识转动惯量

一、原理介绍 现有的转动惯量辨识方案可归纳为两类:离线转动惯量辨识方案和在线转动惯量辨识方案。离线转动惯量辨识方案是在系统控制程序运行前通过直接测试法、加减速法和人工轨迹法等对惯量进行辨识&#xff0c;将测得的参数提供给控制程序使用。离线式辨识方法需要对大量的…