news 2026/4/26 1:16:35

站点回复管理系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
站点回复管理系统

以下实现了一个基于std::vector派生的SiteReplies类,结合内存分配(alloc())、对象管理、生命周期控制、序列化/反序列化、异常处理等功能,覆盖实际开发中常见的场景。

1. 完整代码实现
#include<iostream>#include<vector>#include<string>#include<memory>#include<stdexcept>#include<fstream>#include<sstream>#include<algorithm>#include<ctime>// 前置声明classResponseMessage;classSiteReplies;// 回复消息类:表示站点的一条回复classResponseMessage{private:std::string id;// 回复唯一IDstd::string content;// 回复内容std::string author;// 回复作者time_t createTime;// 创建时间boolisPublished;// 是否发布public:// 构造函数ResponseMessage(conststd::string&id_,conststd::string&content_,conststd::string&author_,boolpublished=false):id(id_),content(content_),author(author_),isPublished(published){createTime=time(nullptr);// 默认当前时间}// 析构函数~ResponseMessage(){std::cout<<"[销毁] 回复ID: "<<id<<std::endl;}// 拷贝构造(禁用,避免浅拷贝)ResponseMessage(constResponseMessage&)=delete;ResponseMessage&operator=(constResponseMessage&)=delete;// 移动构造ResponseMessage(ResponseMessage&&other)noexcept{id=std::move(other.id);content=std::move(other.content);author=std::move(other.author);createTime=other.createTime;isPublished=other.isPublished;other.createTime=0;}// 成员方法voidpublish(){isPublished=true;}voideditContent(conststd::string&newContent){content=newContent;}// 获取器std::stringgetId()const{returnid;}std::stringgetContent()const{returncontent;}std::stringgetAuthor()const{returnauthor;}time_tgetCreateTime()const{returncreateTime;}boolgetIsPublished()const{returnisPublished;}// 序列化:将对象转为字符串(用于存储/传输)std::stringserialize()const{std::ostringstream oss;oss<<id<<"|"<<content<<"|"<<author<<"|"<<createTime<<"|"<<(isPublished?"1":"0");returnoss.str();}// 反序列化:从字符串重建对象staticResponseMessage*deserialize(conststd::string&data){std::istringstreamiss(data);std::string id,content,author,createTimeStr,publishedStr;if(!std::getline(iss,id,'|')||!std::getline(iss,content,'|')||!std::getline(iss,author,'|')||!std::getline(iss,createTimeStr,'|')||!std::getline(iss,publishedStr,'|')){throwstd::invalid_argument("反序列化失败:数据格式错误");}time_t createTime=std::stoll(createTimeStr);boolisPublished=(publishedStr=="1");returnnewResponseMessage(id,content,author,isPublished);}};// 站点回复容器:继承std::vector<ResponseMessage*>,扩展业务逻辑classSiteReplies:publicstd::vector<ResponseMessage*>{private:std::string siteId;// 所属站点IDsize_t maxCapacity;// 最大容量public:// 构造函数SiteReplies(conststd::string&siteId_,size_t maxCap=1000):siteId(siteId_),maxCapacity(maxCap){}// 析构函数:释放所有回复对象~SiteReplies(){clearReplies();std::cout<<"[销毁] 站点"<<siteId<<"的回复容器"<<std::endl;}// 禁用拷贝(避免浅拷贝导致重复释放)SiteReplies(constSiteReplies&)=delete;SiteReplies&operator=(constSiteReplies&)=delete;// 移动构造SiteReplies(SiteReplies&&other)noexcept:std::vector<ResponseMessage*>(std::move(other)),siteId(std::move(other.siteId)),maxCapacity(other.maxCapacity){other.maxCapacity=0;}// 核心方法:分配新回复(内存分配+容器添加)ResponseMessage*alloc(conststd::string&replyId,conststd::string&content,conststd::string&author){// 容量检查if(size()>=maxCapacity){throwstd::overflow_error("回复容器已达最大容量:"+std::to_string(maxCapacity));}// 检查ID唯一性if(findReplyById(replyId)!=nullptr){throwstd::invalid_argument("回复ID已存在:"+replyId);}// 分配内存并添加到容器ResponseMessage*newReply=newResponseMessage(replyId,content,author);push_back(newReply);std::cout<<"[分配] 新增回复ID:"<<replyId<<" 站点:"<<siteId<<std::endl;returnnewReply;}// 根据ID查找回复ResponseMessage*findReplyById(conststd::string&replyId)const{autoit=std::find_if(begin(),end(),[&](constResponseMessage*msg){returnmsg->getId()==replyId;});return(it!=end())?*it:nullptr;}// 发布指定ID的回复boolpublishReply(conststd::string&replyId){ResponseMessage*reply=findReplyById(replyId);if(reply){reply->publish();std::cout<<"[发布] 回复ID:"<<replyId<<std::endl;returntrue;}returnfalse;}// 批量发布作者的所有回复size_tpublishRepliesByAuthor(conststd::string&author){size_t count=0;for(auto*reply:*this){if(reply->getAuthor()==author&&!reply->getIsPublished()){reply->publish();count++;}}std::cout<<"[批量发布] 作者"<<author<<"的"<<count<<"条回复"<<std::endl;returncount;}// 清空所有回复(释放内存)voidclearReplies(){for(auto*reply:*this){deletereply;// 释放单个回复}clear();// 清空vectorstd::cout<<"[清空] 站点"<<siteId<<"的所有回复"<<std::endl;}// 导出回复到文件boolexportToFile(conststd::string&filename)const{std::ofstreamfile(filename);if(!file.is_open()){returnfalse;}file<<"站点ID:"<<siteId<<"\n";file<<"回复总数:"<<size()<<"\n";for(constauto*reply:*this){file<<reply->serialize()<<"\n";}file.close();std::cout<<"[导出] 站点"<<siteId<<"的"<<size()<<"条回复到"<<filename<<std::endl;returntrue;}// 从文件导入回复size_timportFromFile(conststd::string&filename){std::ifstreamfile(filename);if(!file.is_open()){throwstd::runtime_error("无法打开文件:"+filename);}std::string line;// 跳过站点ID行std::getline(file,line);// 跳过回复总数行std::getline(file,line);size_t imported=0;while(std::getline(file,line)&&!line.empty()){try{ResponseMessage*reply=ResponseMessage::deserialize(line);// 检查容量和ID唯一性if(size()>=maxCapacity)break;if(findReplyById(reply->getId())==nullptr){push_back(reply);imported++;}else{deletereply;// 重复ID,释放内存}}catch(conststd::exception&e){std::cerr<<"[导入失败] "<<e.what()<<std::endl;}}file.close();std::cout<<"[导入] 站点"<<siteId<<"成功导入"<<imported<<"条回复"<<std::endl;returnimported;}// 获取站点IDstd::stringgetSiteId()const{returnsiteId;}// 获取容量信息size_tgetMaxCapacity()const{returnmaxCapacity;}size_tgetUsedCapacity()const{returnsize();}};// 辅助函数:打印回复详情voidprintReplyInfo(constResponseMessage*reply){if(!reply){std::cout<<"回复不存在"<<std::endl;return;}std::cout<<"------------------------"<<std::endl;std::cout<<"回复ID: "<<reply->getId()<<std::endl;std::cout<<"内容: "<<reply->getContent()<<std::endl;std::cout<<"作者: "<<reply->getAuthor()<<std::endl;// 第一步:将返回值赋值给局部变量(左值)time_t createTime=reply->getCreateTime();// 第二步:对左值取地址传入ctimestd::cout<<"创建时间: "<<ctime(&createTime);std::cout<<"发布状态: "<<(reply->getIsPublished()?"已发布":"未发布")<<std::endl;std::cout<<"------------------------"<<std::endl;}// 主函数:演示完整使用流程intmain(){try{// 1. 创建站点回复容器(站点ID: blog_001,最大容量5)SiteRepliessiteReplies("blog_001",5);std::cout<<"=== 初始化站点"<<siteReplies.getSiteId()<<"的回复容器 ==="<<std::endl;std::cout<<"最大容量: "<<siteReplies.getMaxCapacity()<<std::endl;// 2. 分配新回复ResponseMessage*r1=siteReplies.alloc("r001","这是第一条回复","user_001");ResponseMessage*r2=siteReplies.alloc("r002","C++真好用","user_002");ResponseMessage*r3=siteReplies.alloc("r003","继承vector要注意内存管理","user_001");// 3. 打印回复详情std::cout<<"\n=== 打印r002详情 ==="<<std::endl;printReplyInfo(r2);// 4. 编辑回复内容r2->editContent("C++容器扩展真灵活");std::cout<<"\n=== 编辑后r002详情 ==="<<std::endl;printReplyInfo(r2);// 5. 发布回复std::cout<<"\n=== 发布回复 ==="<<std::endl;siteReplies.publishReply("r001");siteReplies.publishRepliesByAuthor("user_001");// 6. 查找回复std::cout<<"\n=== 查找回复r003 ==="<<std::endl;printReplyInfo(siteReplies.findReplyById("r003"));// 7. 导出回复到文件std::cout<<"\n=== 导出回复 ==="<<std::endl;if(!siteReplies.exportToFile("replies_blog_001.txt")){std::cerr<<"导出文件失败"<<std::endl;}// 8. 测试容量限制(故意触发异常)std::cout<<"\n=== 测试容量限制 ==="<<std::endl;siteReplies.alloc("r004","第四条回复","user_003");siteReplies.alloc("r005","第五条回复","user_004");try{siteReplies.alloc("r006","第六条回复","user_005");// 超出容量}catch(conststd::overflow_error&e){std::cerr<<"捕获异常: "<<e.what()<<std::endl;}// 9. 导入回复(演示)std::cout<<"\n=== 导入回复 ==="<<std::endl;SiteRepliesnewSite("blog_002");newSite.importFromFile("replies_blog_001.txt");// 10. 清空回复std::cout<<"\n=== 清空回复 ==="<<std::endl;siteReplies.clearReplies();}catch(conststd::exception&e){std::cerr<<"程序异常: "<<e.what()<<std::endl;return1;}std::cout<<"\n=== 程序正常结束 ==="<<std::endl;return0;}
2. 核心功能说明
功能模块实现要点
内存管理alloc()方法负责分配ResponseMessage对象并加入容器,析构函数/clearReplies()释放所有对象,避免内存泄漏
容器扩展继承std::vector<ResponseMessage*>并扩展业务方法(查找、发布、导入导出等)
数据校验分配回复时检查容量限制、ID唯一性,避免非法数据
序列化/反序列化支持回复对象与字符串的互转,实现持久化(文件导入导出)
异常处理捕获容量溢出、ID重复、文件操作失败等异常,保证程序健壮性
生命周期控制禁用拷贝构造,使用移动构造避免浅拷贝问题,明确对象所有权
3. 编译与运行
  • 编译命令(g++):g++ -std=c++17 site_replies.cpp -o site_replies
  • 运行:./site_replies
  • 运行后会生成replies_blog_001.txt文件,包含回复的序列化数据
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 11:35:02

nanoMODBUS 库

一、nanoMODBUS 库介绍 nanoMODBUS 是一款轻量级、跨平台的 MODBUS 协议实现库&#xff0c;专为嵌入式系统&#xff08;如单片机、FPGA 嵌入式硬核、物联网设备&#xff09;设计&#xff0c;核心特点是体积小、资源占用低、易移植、功能精简且够用&#xff0c;完美适配内存/Fl…

作者头像 李华
网站建设 2026/4/26 9:11:41

【技术教程】Reveal.js 中文使用教程

Reveal.js 中文使用教程 Reveal.js 是一个功能强大的开源 HTML 演示文稿框架&#xff0c;使用纯 HTML、CSS 和 JavaScript 即可创建专业、美观的幻灯片。本教程基于官方 demo.html 源码分析&#xff0c;系统介绍 Reveal.js 的使用方法和核心功能。 一、基础结构 1.1 HTML 基…

作者头像 李华
网站建设 2026/4/26 17:37:03

2025年热门AI论文生成工具,具备LaTeX兼容性及自动排版优化

工具对比排名工具名称核心优势支持LaTeX适用场景aibiyeAIGC率降个位数&#xff0c;兼容知网规则是AI痕迹强处理aicheck学术改写优化&#xff0c;语义保留佳是格式统一化askpaper降重降AI一体&#xff0c;20分钟快速响应是初稿优化秒篇人类特征表述优化&#xff0c;高校适配是学…

作者头像 李华
网站建设 2026/4/20 11:39:46

AI学习:什么是MCP,写第一个MCP

什么是MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff09;是一个开放的协议标准&#xff0c;用于连接AI助手&#xff08;如Claude、GPT等&#xff09;与外部工具和数据源。它定义了一套标准化的通信方式&#xff0c;让AI助手能够安全、可靠地调用外部服务。 …

作者头像 李华
网站建设 2026/4/22 4:53:02

重磅喜讯:中国猎鹰特卫国际专委会正式成立

近日&#xff0c;中国猎鹰特卫国际专委会正式宣告成立&#xff0c;这一行业盛事获得中国新时代党建新闻网的大力支持与重点关注。作为中华人民共和国国家大数据门户网联合主办单位&#xff0c;中国新时代党建新闻网长期聚焦国家发展进程中重要社会组织的建设与发展&#xff0c;…

作者头像 李华