2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

news/2024/2/27 19:26:07

文章目录

  • 一、实用工具类模块
    • (一)功能
  • 二、设计和封装
    • (一)日志宏封装
    • (二)mysql_util封装
    • (三)Jsoncpp-API封装
    • (四)file_util封装
    • (五)string_util封装

一、实用工具类模块

在这里插入图片描述

(一)功能

实用工具类模块主要是负责提前实现一些项目中会用到的边缘功能代码,提前实现好了就可以在项目中用到的时候直接使用了。

二、设计和封装

(一)日志宏封装

#ifndef __M_LOGGER_H__
#define __M_LOGGER_H__
#include <stdio.h>
#include <time.h>#define INF 0
#define DBG 1
#define ERR 2
#define DEFAULT_LOG_LEVEL INF
#define LOG(level, format, ...) do{\if (DEFAULT_LOG_LEVEL > level) break;\time_t t = time(NULL);\struct tm *lt = localtime(&t);\char buf[32] = {0};\strftime(buf, 31, "%H:%M:%S", lt);\fprintf(stdout, "[%s %s:%d] " format "\n", buf, __FILE__, __LINE__, ##__VA_ARGS__);\
}while(0)
#define ILOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DLOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ELOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)#endif

(二)mysql_util封装

class mysql_util {public:static MYSQL *mysql_create(const std::string &host,const std::string &username,const std::string &password,const std::string &dbname,uint16_t port = 3306) {MYSQL *mysql = mysql_init(NULL);if (mysql == NULL) {ELOG("mysql init failed!");return NULL;}//2. 连接服务器if (mysql_real_connect(mysql, host.c_str(), username.c_str(), password.c_str(), dbname.c_str(), port, NULL, 0) == NULL) {ELOG("connect mysql server failed : %s", mysql_error(mysql));mysql_close(mysql);return NULL;}//3. 设置客户端字符集if (mysql_set_character_set(mysql, "utf8") != 0) {ELOG("set client character failed : %s", mysql_error(mysql));mysql_close(mysql);return NULL;}return mysql;}static bool mysql_exec(MYSQL *mysql, const std::string &sql) {int ret = mysql_query(mysql, sql.c_str());if (ret != 0) {ELOG("%s\n", sql.c_str());ELOG("mysql query failed : %s\n", mysql_error(mysql));return false;}return true;}static void mysql_destroy(MYSQL *mysql) {if (mysql != NULL) {mysql_close(mysql);}return ;}
};

(三)Jsoncpp-API封装

class json_util{public:static bool serialize(const Json::Value &root, std::string &str) {Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter>sw(swb.newStreamWriter());std::stringstream ss;int ret = sw->write(root, &ss);if (ret != 0) {ELOG("json serialize failed!!");return false;}str = ss.str();return true;}static bool unserialize(const std::string &str, Json::Value &root) {Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);if (ret == false) {ELOG("json unserialize failed: %s", err.c_str());return false;}return true;}
};

(四)file_util封装

class file_util {public:static bool read(const std::string &filename, std::string &body) {//打开文件std::ifstream ifs(filename, std::ios::binary);if (ifs.is_open() == false) {ELOG("%s file open failed!!", filename.c_str());return false;}//获取文件大小size_t fsize = 0;ifs.seekg(0, std::ios::end);fsize = ifs.tellg();ifs.seekg(0, std::ios::beg);body.resize(fsize);//将文件所有数据读取出来ifs.read(&body[0], fsize);if (ifs.good() == false) {ELOG("read %s file content failed!", filename.c_str());ifs.close();return false;}//关闭文件ifs.close();return true;}
};

(五)string_util封装

class string_util{public:static int split(const std::string &src, const std::string &sep, std::vector<std::string> &res) {// 123,234,,,,345size_t pos, idx = 0;while(idx < src.size()) {pos = src.find(sep, idx);if (pos == std::string::npos) {//没有找到,字符串中没有间隔字符了,则跳出循环res.push_back(src.substr(idx));break;}if (pos == idx) {idx += sep.size();continue;}res.push_back(src.substr(idx, pos - idx));idx = pos + sep.size();}return res.size();}
};

http://www.ppmy.cn/news/1170100.html

相关文章

CUDA编程- __syncthreads()函数

基本概念 __syncthreads() 是CUDA编程中非常关键的一个同步原语。它的功能是确保在某个线程块中的所有线程在执行到这个函数之前都已完成它们之前的所有指令。一旦所有线程都到达这个同步点&#xff0c;它们才可以继续执行__syncthreads()之后的指令。这个函数只能在设备代码&…

Docker数据管理、端口映射、容器互联

目录 一、Docker 的数据管理&#xff1a; 1&#xff0e;数据卷&#xff1a; 1.1 宿主机目录/var/www/html 挂载到容器中的/data1&#xff1a; 1.2 测试&#xff1a; 2&#xff0e;数据卷容器&#xff1a; 2.1 创建一个容器作为数据卷容器&#xff1a; 2.2 挂载a1容器中的数据卷…

K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系

写在前面 前几天被问到&#xff0c;这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正 曾以为老去是很遥远的事&#xff0c;突然发现年轻是很久以前的事了。时光好不经用&#xff0c;抬眼已是半生&#xff0c;所谓的中年危机&#xff0c;真正让人焦虑的不是孤单、不…

Kotlin中的函数分类(顶层、成员、局部、递归等)

在 Kotlin 中&#xff0c;函数可以按照不同的方式进行分类。在本篇博客中&#xff0c;我们将介绍以下几种常见的函数分类&#xff0c;并提供示例代码进行演示。 顶层函数&#xff1a; 顶层函数是指定义在文件中的函数&#xff0c;不依赖于任何类或对象。它们可以在文件的任何…

分布式锁 - 理论篇

一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访…

YOLOv7-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1&#xff09;Jmeter没有录制功能 2&#xff09;可以设计非常非常丰富的测试场景 3&#xff09;LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG&#xff1a;录制脚本&#xff0c;&#xff…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数&#xff08;用dp求&#xff09;*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

python 均值滤波

网上公开的均值滤波方法不能较好地对两端进行滤波(有边际效应&#xff0c;或者序列长度缩短)&#xff0c;于是自己写了一个可以对两端也进行滤波的函数 def meanfilt(x, N):x_pad np.r_[np.zeros(N-1), x]denominator np.r_[np.arange(1, N1), np.ones(len(x)-N)*N]win_sum …

详解使用sklearn实现一元线性回归和多元线性回归

[Open In Colab] 文章目录 1. 线性回归简介2. 使用sklearn进行一元线性回归3. 线性回归的coef_参数和intercept_参数4. 使用sklearn实现多元线性回归4.1 利用PolynomialFeatures构造输入4.2 进行多元线性回归 5. 总结 import numpy as np import matplotlib.pyplot as plt1. 线…

Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

靶机 DC-2

DC_2 信息搜集 存活检测 详细扫描 添加 host 后台网页扫描 网页信息搜集 主页面 找到 flag1&#xff0c;提示使用 cewl 密码生成工具 wp 登陆界面 使用 wpscan 扫描用户 wpscan --url http://dc-2/ --enumerate u 扫描出用户 tom、jerry、admin 将三个用户名写入文件中…

一文带你彻底弄懂ZGC

1 推荐的文章 1.1 必看 干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西&#xff1f; 1.2 选看 ZGC有什么缺点? 2 疑问【皆来自上面两篇文章】 2.1 什么使得用户线程工作的同时&#xff0c;让垃圾收集器可以回收垃圾-读写屏障 ZGC (Z Garbage Collector) 和读写屏障: …

灵性·挖掘 3:自我迭代之路

灵性挖掘 3&#xff1a;自我迭代之路 你的观众只有一个&#xff0c;就是你自己不谈感受&#xff0c;只谈行动式感受熬竞争对手用力过猛会反杀自己。进入这种状态是无我的状态。 你的观众只有一个&#xff0c;就是你自己 我活着到底是为了干啥呢&#xff1f; 我吃喝玩乐好像也…

C#/.NET/.NET Core推荐学习书籍

前言 作为一名程序员&#xff0c;我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力。古人有云&#xff1a;“书中自有黄金屋&#xff0c;书中只有颜如玉”&#xff0c;说明了书籍的重要性&#xff0c;没错工作多年来&#xff0c;发现身边那些优秀的同事、大佬都…

【Java基础面试三十九】、 finally是无条件执行的吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; finally是无条件执行的…

Redis --- 安装教程

Redis--- 特性&#xff0c;使用场景&#xff0c;安装 安装教程在Ubuntu下安装在Centos7.6下安装Redis5 特性在内存中存储数据可编程的扩展能力持久化集群高可用快速 应用场景实时数据存储作为缓存或者Session存储消息队列 安装教程 &#x1f680;安装之前切换到root用户。 在…

敏捷是怎么提高工作效率的

敏捷管理是一门极力减少不必要工作量的艺术。 谷歌、亚马逊、苹果、微信、京东等全球 500 强企业都在用的管理方法&#xff0c;适用于各行各业&#xff0c;被盛赞为应获“管理学的诺贝尔奖”。 它专注于让员工不受种种杂事的羁绊&#xff0c;激发个体斗志&#xff0c;释放出巨大…

基于SSM的社区物业管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…
最新文章