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

【C++ 类和数据抽象】消息处理示例(2)

目录

一、消息处理系统的核心价值

1.1 现代软件架构中的消息驱动

1.2 消息处理系统的关键组件

二、消息处理系统概述

三、Message类设计

3.1 成员变量

3.2. 成员函数

3.3. 私有辅助函数

四、Folder类设计

五、代码实现

六、数据抽象在消息处理系统中的应用

七、总结


在C++编程中,数据抽象是一个核心概念,它允许开发者将对象的内部实现细节隐藏起来,只暴露必要的接口给外部世界。这种设计方式不仅提高了代码的安全性和可维护性,还增强了代码的可重用性。本文将通过一个具体的消息处理示例,深入探讨C++中的类与数据抽象,包括类的定义、成员函数、访问控制、复制控制以及它们在消息处理系统中的应用。

一、消息处理系统的核心价值

1.1 现代软件架构中的消息驱动

消息处理机制是构建复杂系统的基石,广泛应用于:

应用领域典型场景核心需求
GUI开发事件响应处理实时性、优先级管理
游戏引擎实体组件通信高吞吐量、低延迟
分布式系统节点间通信可靠性、序列化支持
IoT系统设备状态更新异步处理、资源优化
// 典型消息处理流程示例
class Button {
public:void onClick(std::function<void()> handler) {clickHandlers.push_back(handler);}void simulateClick() {for(auto& handler : clickHandlers) {handler();}}
private:std::vector<std::function<void()>> clickHandlers;
};

1.2 消息处理系统的关键组件

现代消息系统的核心要素: 

二、消息处理系统概述

为了具体说明C++中的类与数据抽象,我们将设计一个简单的消息处理系统。该系统包含两个主要类:Message类和FolderMessage类表示电子邮件或其他类型的消息,而Folder类表示消息所出现的文件夹。一个给定消息可以出现在多个文件夹中。

三、Message类设计

3.1 成员变量

Message类包含两个主要的成员变量:

  • std::string contents用于存储消息的内容。
  • std::set<Folder*> folders用于存储指向包含该消息的文件夹的指针集。

3.2. 成员函数

  • 构造函数:用于初始化消息的内容,但不指定文件夹。
  • 析构函数:用于在消息被销毁时,从所有包含它的文件夹中移除该消息。
  • 复制构造函数:用于复制消息的内容和文件夹指针集,并确保新消息被添加到所有原始消息所在的文件夹中。
  • 赋值操作符:用于将一个消息的内容和文件夹指针集复制到另一个消息中,并处理自赋值情况。
  • save(Folder&):用于将消息保存到指定的文件夹中。
  • remove(Folder&):用于从指定的文件夹中移除消息。

3.3. 私有辅助函数

  • put_Msg_in_Folders(const std::set<Folder*>&):用于将消息添加到多个文件夹中。
  • remove_Msg_from_Folders():用于从所有包含消息的文件夹中移除该消息。

四、Folder类设计

虽然本文的重点是Message类,但为了完整性,我们简要描述Folder类的设计。Folder类包含一个指向Message对象的指针集,以及用于添加和移除消息的成员函数。

五、代码实现

以下是Message类的代码实现:

#include <iostream>
#include <set>
#include <string>
using namespace std;// 前向声明Message类,供Folder类使用
class Message;// Folder类定义(仅声明函数,不访问Message具体成员)
class Folder {
public:void addMsg(Message* msg);void remMsg(Message* msg);void printMessages() const;private:set<Message*> messages;
};// Message类完整定义(包含getContent()成员函数)
class Message {
public:explicit Message(const string& str = "") : contents(str) {cout << "Message created: " << contents << endl;}// 获取消息内容(供Folder类调用)const string& getContent() const {return contents;}// 复制构造函数Message(const Message& m) : contents(m.contents), folders(m.folders) {cout << "Message copied: " << contents << endl;put_Msg_in_Folders(folders); // 复制时添加到关联的文件夹}// 赋值操作符Message& operator=(const Message& rhs) {if (this != &rhs) {cout << "Message assignment started" << endl;remove_Msg_from_Folders(); // 先从原文件夹移除contents = rhs.contents;folders = rhs.folders;put_Msg_in_Folders(folders); // 添加到新文件夹cout << "Message assigned: " << contents << endl;}return *this;}// 析构函数~Message() {cout << "Message destroyed: " << contents << endl;remove_Msg_from_Folders(); // 销毁时从所有文件夹移除}// 保存消息到文件夹void save(Folder& folder) {folders.insert(&folder);folder.addMsg(this); // 调用文件夹的添加接口}// 从文件夹中移除消息void remove(Folder& folder) {folders.erase(&folder);folder.remMsg(this); // 调用文件夹的移除接口}private:string contents;set<Folder*> folders; // 该消息所属的文件夹集合// 私有辅助函数:将消息添加到多个文件夹void put_Msg_in_Folders(const set<Folder*>& rhs) {for (auto* folder : rhs) {folder->addMsg(this); // 通过文件夹接口添加消息}}// 私有辅助函数:从所有关联文件夹中移除消息void remove_Msg_from_Folders() {for (auto* folder : folders) {folder->remMsg(this); // 通过文件夹接口移除消息}folders.clear(); // 清空文件夹集合}
};// Folder类成员函数实现(此时Message类已完整定义)
void Folder::addMsg(Message* msg) {messages.insert(msg);cout << "Folder added message: " << msg->getContent() << endl;
}void Folder::remMsg(Message* msg) {auto it = messages.find(msg);if (it != messages.end()) {messages.erase(it);cout << "Folder removed message: " << msg->getContent() << endl;}
}void Folder::printMessages() const {cout << "Folder contains " << messages.size() << " messages: ";for (auto* msg : messages) {cout << msg->getContent() << " ";}cout << endl;
}int main() {// 创建消息和文件夹cout << "----- Create message and folders -----" << endl;Message msg("Hello, World!");Folder folder1, folder2;// 保存消息到文件夹cout << "\n----- Save message to folders -----" << endl;msg.save(folder1);msg.save(folder2);// 打印文件夹内容cout << "\n----- Folder1 contents -----" << endl;folder1.printMessages();cout << "\n----- Folder2 contents -----" << endl;folder2.printMessages();// 创建消息副本(测试复制构造函数)cout << "\n----- Create message copy -----" << endl;Message msgCopy(msg);// 测试赋值操作符cout << "\n----- Test assignment operator -----" << endl;Message msgAssign("Original");msgAssign = msg;// 移除消息从文件夹cout << "\n----- Remove message from folder1 -----" << endl;msg.remove(folder1);// 再次打印文件夹内容cout << "\n----- Folder1 contents after removal -----" << endl;folder1.printMessages();cout << "\n----- Folder2 contents after removal -----" << endl;folder2.printMessages();return 0;
}

  • 构造函数Message类的构造函数用于初始化消息的内容。
  • 复制构造函数:复制构造函数用于复制消息的内容和文件夹指针集,并调用put_Msg_in_Folders函数将新消息添加到所有原始消息所在的文件夹中。
  • 赋值操作符:赋值操作符用于将一个消息的内容和文件夹指针集复制到另一个消息中。它首先调用remove_Msg_from_Folders函数从所有包含原始消息的文件夹中移除该消息,然后复制内容和文件夹指针集,并调用put_Msg_in_Folders函数将新消息添加到所有目标消息所在的文件夹中。
  • 析构函数:析构函数用于在消息被销毁时,调用remove_Msg_from_Folders函数从所有包含它的文件夹中移除该消息。
  • save和remove函数save函数用于将消息保存到指定的文件夹中,而remove函数用于从指定的文件夹中移除消息。这两个函数都假设Folder类有addMsgremMsg方法,分别用于添加和移除消息。
  • 私有辅助函数put_Msg_in_Folders函数用于将消息添加到多个文件夹中,而remove_Msg_from_Folders函数用于从所有包含消息的文件夹中移除该消息。

六、数据抽象在消息处理系统中的应用

在消息处理系统中,数据抽象通过Message类和Folder类实现。Message类隐藏了消息的内部实现细节,如消息内容的存储方式和文件夹指针集的管理方式。外部代码只能通过Message类提供的公共接口(如构造函数、复制构造函数、赋值操作符、析构函数、saveremove函数)来操作消息。

同样,Folder类也隐藏了文件夹的内部实现细节,如消息指针集的管理方式。外部代码只能通过Folder类提供的公共接口(如addMsgremMsg函数)来操作文件夹中的消息。

通过这种方式,数据抽象使得消息处理系统的实现细节对外部代码透明,从而提高了代码的安全性和可维护性。同时,由于Message类和Folder类都是可重用的抽象数据类型,因此它们可以被用于构建更复杂的消息处理系统。

七、总结

本文深入探讨了C++中的类与数据抽象。定义了Message类和Folder类,并展示了如何通过数据抽象来隐藏对象的内部实现细节,只暴露必要的接口给外部世界。这种设计方式不仅提高了代码的安全性和可维护性,还增强了代码的可重用性。

在实际编程中,合理运用类和对象,以及坚持数据抽象的原则,可以帮助我们设计出更健壮、更易于维护的软件系统。作为程序员,我们应该深入理解C++的类和对象机制,以及它们如何帮助我们更好地组织和管理代码。同时,也应当意识到数据抽象不仅是一种编程技术,更是一种设计哲学,它促使我们从更高的视角审视代码结构,追求代码的优雅和高效。


相关文章:

【C++ 类和数据抽象】消息处理示例(2)

目录 一、消息处理系统的核心价值 1.1 现代软件架构中的消息驱动 1.2 消息处理系统的关键组件 二、消息处理系统概述 三、Message类设计 3.1 成员变量 3.2. 成员函数 3.3. 私有辅助函数 四、Folder类设计 五、代码实现 六、数据抽象在消息处理系统中的应用 七、总结…...

kafka 中消费者 groupId 是什么

&#x1f4da; 什么是 groupId&#xff1f; groupId 是 Kafka 里消费者组&#xff08;Consumer Group&#xff09;的唯一标识。 同一个 groupId 的消费者&#xff0c;一起共享消费&#xff0c;一条消息只给组内一个消费者处理。不同 groupId 的消费者组&#xff0c;各自独立消…...

单相交直交变频电路设计——matlab仿真+4500字word报告

微♥“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 硬件电路采用Altium designer设计&#xff0c;仿真采用Matlab软件 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2018Rb&#xff09;软件。建议采用matlab2018Rb及以上版本打开。&#xff08;若需要其他…...

Python中的协程(Coroutine)

Python中的协程&#xff08;Coroutine&#xff09; 是一种轻量级的异步执行单元&#xff0c;主要用于解决IO密集型任务的性能问题。Python 3.5引入了 async/await 语法&#xff0c;使得协程变得简洁且易于使用。协程的核心是通过事件循环&#xff08;Event Loop&#xff09; 来…...

【QT】QT多线程

QT多线程 1.涉及到类和方法示例代码&#xff1a;未重写run函数 2.使用思路3.常用方法4.示例代码1&#xff1a;重写线程run函数现象&#xff1a; 5.示例代码2&#xff1a;多线程显示切换图片&#xff0c;使用公有方法现象&#xff1a; 1.涉及到类和方法 类&#xff1a;QThread 示…...

基于深度学习的医疗诊断辅助系统设计

标题:基于深度学习的医疗诊断辅助系统设计 内容:1.摘要 随着医疗数据的爆炸式增长和深度学习技术的飞速发展&#xff0c;开发基于深度学习的医疗诊断辅助系统具有重要的现实意义。本研究的目的在于设计一个高效、准确的医疗诊断辅助系统&#xff0c;以辅助医生进行更精准的诊断…...

C++ RAII

RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是 C 编程中的核心设计理念&#xff0c;用于管理资源的分配和释放。它通过将资源的生命周期绑定到对象的生命周期&#xff0c;利用 C 的自动对象管理机制&#xff08;主要是栈…...

Linux进程学习【环境变量】进程优先级

进程优先级的基本概念 在 Linux 中&#xff0c;每个进程都有一个优先级&#xff0c;操作系统根据这个优先级来决定进程的执行顺序。优先级越高&#xff0c;进程的执行就越频繁。通常&#xff0c;进程优先级是由以下两个部分构成&#xff1a; 静态优先级&#xff08;PRI&#x…...

Leetcode:283. 移动零

题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0]…...

BIOES 标签的含义

BIOES 标签的含义 ​B (Begin) 表示一个实体的开始。例如&#xff0c;在句子 “北京是中国的首都” 中&#xff0c;“北京” 作为地点实体的开头&#xff0c;首字会被标注为 B-LOC&#xff0c;后续字可能标注为 I-LOC。 ​I (Inside) 表示一个实体的中间或内部部分。例如&a…...

mAh 与 Wh:电量单位的深度解析

1. 基础定义与物理意义 1.1 mAh&#xff08;毫安时&#xff09; 定义&#xff1a;表示电池以毫安&#xff08;mA&#xff09;为单位的电流持续放电 1 小时的电荷量。1 mAh1 mA1 h3.6 C(库仑&#xff0c;电荷单位)局限性&#xff1a;仅反映电池存储的电荷量&#xff0c;未考虑电…...

安卓屏播放语音失败,报错TextToSpeech: speak failed: not bound to TTS engine

最近碰到一个很棘手的问题&#xff0c;无缘无故&#xff0c;之前在Android9.0跑得好好的程序&#xff0c;升级安装系统到Android13后&#xff0c;就发现之前能放的语音&#xff0c;现在放不了了&#xff0c;真是头大&#xff0c;所以我摸索着尝试解决&#xff0c;且看我的解决过…...

C语言学习之结构体

在C语言中&#xff0c;我们已经学了好几种类型的数据。比如整型int、char、short等&#xff0c;浮点型double、float等。但是这些都是基本数据类型&#xff0c;而这些数据类型应用在实际编程里显然是不够用的。比如我们没有办法用一旦数据类型来定义一个”人“的属性。因此这里…...

layui获取无法获取表单数据,data.field一直为空

form.on(submit(*), function(data){console.log(data.field) //当前容器的全部表单字段&#xff0c;名值对形式&#xff1a;{name: value}return false; //阻止表单跳转。如果需要表单跳转&#xff0c;去掉这段即可。}); console.log(data.field)一直显示为空&#xff0…...

「Mac畅玩AIGC与多模态02」部署篇01 - 在 Mac 上部署 Ollama + Open WebUI

一、概述 本篇介绍如何在 macOS 环境下本地部署 Ollama 推理服务,并通过 Open WebUI 实现可视化交互界面。该流程无需 CUDA 或专用驱动,适用于 M 系列或 Intel 芯片的 Mac,便于快速测试本地大语言模型能力。 二、部署流程 1. 环境准备 安装 Homebrew(如尚未安装):/bin…...

量子力学:量子通信

量子通信是利用量子力学原理对信息进行编码、传输和处理的新型通信方式&#xff0c;以下是其详细介绍及业界发展现状&#xff1a; 基本原理 量子叠加态 &#xff1a;量子系统可以处于多个状态的叠加&#xff0c;如光子的偏振方向可以同时处于水平和垂直方向的叠加态&#xff…...

《大型网站技术架构-核心原理与案例分析》笔记

:::info &#x1f4a1; 根据 遗忘曲线&#xff1a;如果没有记录和回顾&#xff0c;6天后便会忘记75%的内容 读书笔记正是帮助你记录和回顾的工具&#xff0c;不必拘泥于形式&#xff0c;其核心是&#xff1a;记录、翻看、思考::: 书名大型网站技术架构-核心原理与案例分析作者…...

log4cpp进阶指南

&#x1f4dd; log4cpp进阶指南 1. 按天切割日志 log4cpp 默认是按文件大小来切割日志的。为了按天切割日志&#xff0c;通常需要自己进行时间判断并手动处理日志文件的切割。 1.1 解决方案 虽然 RollingFileAppender 只支持按大小切割&#xff0c;但你可以使用以下策略&…...

树莓派超全系列教程文档--(43)树莓派内核简介及更新

树莓派内核简介及更新 简介更新 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 简介 Raspberry Pi 内核是 托管在 GitHub 上&#xff1b;更新滞后于上游 Linux内核。上游内核持续更新&#xff0c;而 Raspberry Pi 则将 Linux 内核的长期版本整合…...

第二章、在Windows上部署Dify:从修仙小说到赛博飞升的硬核指南

第1章:安装 wsl (Windows Subsystem for Linux) 上一章我们聊了什么是Dify,这一章我们讲一下怎么才能用Dify。 使用Dify就需要我们在本地部署Dify; 部署Dify就需要用到”Docker“; 要想使用“Docter”就需要用到wsl。 那什么是wsl呢?简单来说就是让你的电脑拥有另一个叫…...

淘宝商品主图标题api接口

1、输入淘宝商品id或者链接&#xff0c;点查询 2、查询淘宝商品主图&#xff0c;商品标题&#xff0c;商品价格&#xff0c;卖家旺旺 3、支持api接口...

小结:BFD

*BFD&#xff08;双向转发检测&#xff0c;Bidirectional Forwarding Detection&#xff09;是一种快速、轻量级的故障检测机制&#xff0c;用于检测网络中两点之间的连通性。它广泛应用于各种场景 1. 检测 IP 链路 应用场景&#xff1a; BFD 用于检测两台设备之间的 IP 层连…...

收藏按钮变色问题

1.问题描述 无论是否收藏&#xff0c;收藏按钮都显示黄色&#xff0c;但点击收藏按钮后却能发生颜色变化 2.解决思路 经过调试发现isCollected返回的是整个对象&#xff0c;因此在store的方法里面找到了相应的函数进行修改使得isCollected返回相应的值 修改前&#xff1a; 修…...

小程序发布后,不能强更的情况下,怎么通知到用户需要去更新?

哈喽&#xff0c;我想和大家分享一下我在开发记账小程序时遇到的一个问题&#xff0c;以及我找到的解决办法。 这个记账小程序从一开始&#xff0c;我就特别在意用户的隐私&#xff0c;所以把记账数据都存到了本地缓存里&#xff0c;还做了个手动备份的功能。但系统嘛&#xf…...

4.2.2 MySQL索引原理以及SQL优化

文章目录 4.2.2 MySQL索引原理以及SQL优化1. 索引与约束1. 索引是什么2. 索引的目的3. 几种索引4. 约束1.外键2. 约束 vs 索引的区别 5. 索引实现1. 索引存储2. 页3. B树4. B树层高问题5. 自增id6. 聚集索引7. 辅助索引 8. innnodb体系结构1. buffer pool2. change buffer 9. 最…...

02_值相同、类型不同,用 equals() 比较为什么是 false?

02_值相同、类型不同&#xff0c;用 equals() 比较为什么是 false&#xff1f; 场景示例 Map<Long, String> map; Integer keyWord 4; if (map.containsKey(keyWord)) {// ... }结果&#xff1a; → 编译通过&#xff0c;但 containsKey 返回 false&#xff0c;逻辑错…...

leetcode--盛最多水的容器,接雨水

11.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不…...

AlexNet网络搭建

AlexNet网络模型搭建 环境准备 首先在某个盘符下创建一个文件夹&#xff0c;就叫AlexNet吧&#xff0c;用来存放源代码。 然后新建一个python文件&#xff0c;就叫plot.py吧&#xff0c;往里面写入以下代码&#xff0c;用于下载数据集&#xff1a; # FashionMNIST里面包含了…...

常用第三方库:sqflite数据库应用

常用第三方库&#xff1a;sqflite数据库应用 一、基础概念 1.1 什么是sqflite&#xff1f; sqflite是Flutter官方推荐的SQLite数据库插件&#xff0c;它提供了在Flutter应用中使用SQLite数据库的能力。SQLite是一个轻量级的、嵌入式的关系型数据库&#xff0c;特别适合移动应…...

【论文阅读】-周总结-第5周

1. 【论文阅读24】并行 TCN-LSTM 风电预测模型&#xff08;2024-02&#xff09; 链接 论文信息&#xff1a; Liu S, Xu T, Du X, et al. A hybrid deep learning model based on parallel architecture TCN-LSTM with Savitzky-Golay filter for wind power prediction. Ener…...

深入理解 JavaScript 的 typeof 运算符:返回的数据类型

JavaScript 的 typeof 运算符是开发中用于检测值类型的基础工具。虽然看似简单&#xff0c;但其行为存在需要开发者理解的微妙细节。本文将解析 typeof 返回的数据类型&#xff0c;探讨边界案例&#xff0c;并分享类型检查的最佳实践。 typeof 会返回哪些类型&#xff1f; typ…...

前端零基础入门到上班:【Day8】JavaScript 基础语法入门

前端零基础入门到上班:【Day8】JavaScript 基础语法入门&#xff08;超全&#xff01;&#xff01;&#xff01;&#xff09; 一、JavaScript 简介二、引入 JavaScript 的三种方式三、变量与常量&#xff08;var、let、const&#xff09;3.1 var &#xff08;传统方式&#xff…...

ppt流程图怎么?ppt流程图模板大全

ppt流程图怎么&#xff1f;ppt流程图剪头模板&#xff0c;ppt流程图模板大全: ppt流程图_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...

makefile总结

Makefile 学习视频&#xff1a;1、野火的基础入门篇-第32讲 Makefile三要素_哔哩哔哩_bilibili ​ 2、b站视频04 一个稍复杂的Makefile_哔哩哔哩_bilibili 学习资料&#xff1a;第2个视频对应的Make/make.md 无限十三年/CPP - 码云 - 开源中国 ch0_Makefile简介 Makefile是什…...

MIME 类型是个什么东西?

MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;即多用途互联网邮件扩展类型&#xff0c;它是一种标准&#xff0c;用于表示文档、文件或字节流的性质和格式。 最初设计用于电子邮件系统&#xff0c;后来被广泛应用于网页、HTTP 协议等领域&#xff0…...

javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)

在现代互联网开发中&#xff0c;前端与后端的分工协作非常重要。本文结合实际架构图&#xff0c;全面梳理前端技术栈、后端技术栈以及服务器端整体流程&#xff0c;帮助初学者建立清晰的整体认知。 一、整体架构概览 系统整体划分为三个主要部分&#xff1a; B端&#xff08;…...

spring-rabbit的CachingConnectionFactory默认参数导致消费者Channel数量暴增问题解决

文章目录 1.前言2.解决2.1消费监听方法中关闭channel2.2 配置设置两个参数 3.总结 1.前言 由于之前写了一个好用的rabbitmq-spring-boot-start启动器&#xff0c;后面在生产实践之后反馈消费者连接的Channel数量过多&#xff0c;一个消费者的Channel数量可以达到好几百&#xf…...

线上JVM调优与全栈性能优化 - Java架构师面试实战

线上JVM调优与全栈性能优化 - Java架构师面试实战 本文通过一场互联网大厂的Java架构师面试&#xff0c;深入探讨了线上JVM调优、OOM定位、死锁定位、内存和CPU调优、线程池调优、数据库调优、缓存调优、网络调优、微服务调优及分布式调优等关键领域。 第一轮提问 面试官&am…...

【KWDB创作者计划】_企业级多模数据库实战:用KWDB实现时序+关系数据毫秒级融合(附代码、性能优化与架构图)

一、技术背景与行业痛点 1.1 多模数据融合挑战 场景痛点&#xff1a; 工业物联网设备每秒产生百万级传感器数据&#xff08;时序数据&#xff09;。需关联设备档案&#xff08;关系数据&#xff09;生成设备健康报告&#xff0c;传统方案需多数据库跳转&#xff0c;延迟>5…...

“八股训练营”学习总结

在参加为期 40 天的八股训练营的这段时间里&#xff0c;我收获满满&#xff0c;不仅在知识技能上得到了提升&#xff0c;更在学习习惯和自我认知方面有了很大的进步。 在知识层面&#xff0c;训练营涵盖了网络、数据库、缓存以及python测试开发等多方面的知识点。 网络方面&a…...

java工具类

LocalDateTime LocalDateTime可以获取当前时间&#xff1a; LocalDateTime now LocalDateTime.now(); 同时他也可以获取指定时间&#xff1a; LocalDateTime dateTime LocalDateTime.of(2023, 5, 15, 10, 30) 若我们时间值超出了我们的实际情况值&#xff0c;我们将会出现…...

「OC」源码学习——alloc与init的实现

「OC」源码学习——alloc与init的实现 前言 费劲千辛万苦终于项目给写完了&#xff0c;进入下一个阶段&#xff0c;源码的学习 alloc的调用顺序 我们在main函数之中打上断点&#xff0c;先运行 再在alloc之中的各个函数之中打上断点&#xff0c;在关键步骤上打上断点&#…...

AOSP Android14 Launcher3——动画核心类QuickstepTransitionManager详解

Launcher3中&#xff0c;有一个类在跟桌面相关的各种动画中扮演着非常关键的角色&#xff0c;这个类就是QuickstepTransitionManager。 QuickstepTransitionManager在aosp中的路径为&#xff1a;aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/QuickstepT…...

STM32:看门狗

独立看门狗 简介 独立看门狗&#xff08;IWDG&#xff09;由独立的低速时钟&#xff08;LSI&#xff09;驱动&#xff0c;即便主时钟发生故障&#xff0c;它依然能够正常工作。其主要作用是在程序出现异常时&#xff0c;通过复位来保障系统的稳定性。独立看门狗的喂狗操作相对…...

第十三步:vue

Vue 1、上手 1、安装 使用命令&#xff1a;npm create vuelatestvue文件后缀为.vueconst app createApp(App)&#xff1a;初始化根组件app.mount("#app")&#xff1a;挂载根组件到页面 2、文件 script标签&#xff1a;编写jstemplate标签&#xff1a;编写htmls…...

《代码整洁之道》第8章 边界 - 笔记

甚至是你团队里其他组写的你无法随意修改的代码。 这些外部代码是你的**“边界”。它们可能会升级、可能会有 Bug、可能会有反人类的设计、甚至你将来可能想换一个类似的库或服务。如果你的应用代码直接且紧密地依赖**这些外部代码的具体类、方法、异常等细节&#xff0c;那么…...

【CF】Day45——Codeforces Round 1021 (Div. 2) BC

阅读理解。。。不过挺有意思&#xff08; B. Sasha and the Apartment Purchase 题目&#xff1a; 思路&#xff1a; 看了半天没看懂... 题目叽里咕噜一大堆&#xff0c;说白了就是让我们在一个 可删除k个数 的 数组 中选 一些点 且 这些点的f(x) 是此时 删完了k个数之后的数组…...

《代码整洁之道》第5章 格式 - 笔记

你应该选择一套管理代码格式的简单规则。如果是团队&#xff0c;应该选择一套团队一致同意采用的简单格式规则。 最重要的原则&#xff1a;一致性&#xff08;Consistency&#xff09;&#xff01; 没有完美的格式规范&#xff0c;但有统一的规范。 整个团队&#xff08;或者…...

通过示例学习:连续 XOR

通过示例学习&#xff1a;连续 XOR 如果我们想在 PyTorch 中构建神经网络&#xff0c;可以使用 &#xff08;with&#xff09; 指定所有参数&#xff08;权重矩阵、偏差向量&#xff09;&#xff0c;让 PyTorch 计算梯度&#xff0c;然后调整参数。但是&#xff0c;如果我们有很…...

加密算法 AES、RSA、MD5、SM2 的对比分析与案例(AI)

加密算法 AES、RSA、MD5、SM2 的对比分析 一、相同点 ‌密码学基础‌ 均为现代密码学核心算法&#xff0c;用于保障数据安全。‌数据处理‌ 均涉及数据转换&#xff08;加密、签名、哈希等&#xff09;。‌密钥依赖‌ AES、RSA、SM2 依赖密钥&#xff08;对称或非对称&#x…...