书法网站开发的前景做图书馆网站
2026/1/8 16:05:25 网站建设 项目流程
书法网站开发的前景,做图书馆网站,wordpress付费版,东营有网站以下实现了一个基于 std::vector 派生的 SiteReplies 类#xff0c;结合内存分配#xff08;alloc()#xff09;、对象管理、生命周期控制、序列化/反序列化、异常处理等功能#xff0c;覆盖实际开发中常见的场景。 1. 完整代码实现 #include iostream #include 结合内存分配alloc()、对象管理、生命周期控制、序列化/反序列化、异常处理等功能覆盖实际开发中常见的场景。1. 完整代码实现#includeiostream#includevector#includestring#includememory#includestdexcept#includefstream#includesstream#includealgorithm#includectime// 前置声明classResponseMessage;classSiteReplies;// 回复消息类表示站点的一条回复classResponseMessage{private:std::string id;// 回复唯一IDstd::string content;// 回复内容std::string author;// 回复作者time_t createTime;// 创建时间boolisPublished;// 是否发布public:// 构造函数ResponseMessage(conststd::stringid_,conststd::stringcontent_,conststd::stringauthor_,boolpublishedfalse):id(id_),content(content_),author(author_),isPublished(published){createTimetime(nullptr);// 默认当前时间}// 析构函数~ResponseMessage(){std::cout[销毁] 回复ID: idstd::endl;}// 拷贝构造禁用避免浅拷贝ResponseMessage(constResponseMessage)delete;ResponseMessageoperator(constResponseMessage)delete;// 移动构造ResponseMessage(ResponseMessageother)noexcept{idstd::move(other.id);contentstd::move(other.content);authorstd::move(other.author);createTimeother.createTime;isPublishedother.isPublished;other.createTime0;}// 成员方法voidpublish(){isPublishedtrue;}voideditContent(conststd::stringnewContent){contentnewContent;}// 获取器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;ossid|content|author|createTime|(isPublished?1:0);returnoss.str();}// 反序列化从字符串重建对象staticResponseMessage*deserialize(conststd::stringdata){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 createTimestd::stoll(createTimeStr);boolisPublished(publishedStr1);returnnewResponseMessage(id,content,author,isPublished);}};// 站点回复容器继承std::vectorResponseMessage*扩展业务逻辑classSiteReplies:publicstd::vectorResponseMessage*{private:std::string siteId;// 所属站点IDsize_t maxCapacity;// 最大容量public:// 构造函数SiteReplies(conststd::stringsiteId_,size_t maxCap1000):siteId(siteId_),maxCapacity(maxCap){}// 析构函数释放所有回复对象~SiteReplies(){clearReplies();std::cout[销毁] 站点siteId的回复容器std::endl;}// 禁用拷贝避免浅拷贝导致重复释放SiteReplies(constSiteReplies)delete;SiteRepliesoperator(constSiteReplies)delete;// 移动构造SiteReplies(SiteRepliesother)noexcept:std::vectorResponseMessage*(std::move(other)),siteId(std::move(other.siteId)),maxCapacity(other.maxCapacity){other.maxCapacity0;}// 核心方法分配新回复内存分配容器添加ResponseMessage*alloc(conststd::stringreplyId,conststd::stringcontent,conststd::stringauthor){// 容量检查if(size()maxCapacity){throwstd::overflow_error(回复容器已达最大容量std::to_string(maxCapacity));}// 检查ID唯一性if(findReplyById(replyId)!nullptr){throwstd::invalid_argument(回复ID已存在replyId);}// 分配内存并添加到容器ResponseMessage*newReplynewResponseMessage(replyId,content,author);push_back(newReply);std::cout[分配] 新增回复ID:replyId 站点:siteIdstd::endl;returnnewReply;}// 根据ID查找回复ResponseMessage*findReplyById(conststd::stringreplyId)const{autoitstd::find_if(begin(),end(),[](constResponseMessage*msg){returnmsg-getId()replyId;});return(it!end())?*it:nullptr;}// 发布指定ID的回复boolpublishReply(conststd::stringreplyId){ResponseMessage*replyfindReplyById(replyId);if(reply){reply-publish();std::cout[发布] 回复ID:replyIdstd::endl;returntrue;}returnfalse;}// 批量发布作者的所有回复size_tpublishRepliesByAuthor(conststd::stringauthor){size_t count0;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::stringfilename)const{std::ofstreamfile(filename);if(!file.is_open()){returnfalse;}file站点ID:siteId\n;file回复总数:size()\n;for(constauto*reply:*this){filereply-serialize()\n;}file.close();std::cout[导出] 站点siteId的size()条回复到filenamestd::endl;returntrue;}// 从文件导入回复size_timportFromFile(conststd::stringfilename){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 imported0;while(std::getline(file,line)!line.empty()){try{ResponseMessage*replyResponseMessage::deserialize(line);// 检查容量和ID唯一性if(size()maxCapacity)break;if(findReplyById(reply-getId())nullptr){push_back(reply);imported;}else{deletereply;// 重复ID释放内存}}catch(conststd::exceptione){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 createTimereply-getCreateTime();// 第二步对左值取地址传入ctimestd::cout创建时间: ctime(createTime);std::cout发布状态: (reply-getIsPublished()?已发布:未发布)std::endl;std::cout------------------------std::endl;}// 主函数演示完整使用流程intmain(){try{// 1. 创建站点回复容器站点ID: blog_001最大容量5SiteRepliessiteReplies(blog_001,5);std::cout 初始化站点siteReplies.getSiteId()的回复容器 std::endl;std::cout最大容量: siteReplies.getMaxCapacity()std::endl;// 2. 分配新回复ResponseMessage*r1siteReplies.alloc(r001,这是第一条回复,user_001);ResponseMessage*r2siteReplies.alloc(r002,C真好用,user_002);ResponseMessage*r3siteReplies.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_errore){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::exceptione){std::cerr程序异常: e.what()std::endl;return1;}std::cout\n 程序正常结束 std::endl;return0;}2. 核心功能说明功能模块实现要点内存管理alloc()方法负责分配ResponseMessage对象并加入容器析构函数/clearReplies()释放所有对象避免内存泄漏容器扩展继承std::vectorResponseMessage*并扩展业务方法查找、发布、导入导出等数据校验分配回复时检查容量限制、ID唯一性避免非法数据序列化/反序列化支持回复对象与字符串的互转实现持久化文件导入导出异常处理捕获容量溢出、ID重复、文件操作失败等异常保证程序健壮性生命周期控制禁用拷贝构造使用移动构造避免浅拷贝问题明确对象所有权3. 编译与运行编译命令gg -stdc17 site_replies.cpp -o site_replies运行./site_replies运行后会生成replies_blog_001.txt文件包含回复的序列化数据

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询