C语言对话-13.怎样持久化一个对象 📅 发布时间:2026/7/11 7:57:12 👁️ 浏览次数: 徐波 翻译当我疲惫地穿过走廊时正是欧洲当地时间零点十分。我已经筋疲力尽又有三个下午的值班在等着我。一小束柔和的光散发到凉爽的金属走廊上。梅杰.吉尔伯的房门微开着我想这是巧合尽管通风系统最近工作负荷太重很可能也是一个原因。更巧合的是科洛纳正在梅杰的办公室与梅杰会谈而不是相反。另一方面我听见里面正好有低语声肯定不是巧合我慢下脚步凝神细听。通风机时而呜咽时而喘气的响声使我的旁听显得很困难但也使他们没有意识到我的到来。“我…但那些人实在是固执透了”另一个声音说道我后来才听出是科洛纳。然后是一阵沉默接着吉尔伯的声音又响了起来“那么他们还在路上有多少什么时候到达”“至少有六船”稍停片刻“给他们一个月联合国必须能够控制住局势直到我们讨论出决定采用什么技术不管多长时间。”一阵大笑肯定是吉尔伯“联合国你说的是那个所谓的国家联盟”“它们都一样。亚洲人很固执我们不得不给他们泄泄气。”“你知不知道小伙子你后来看上去有些分心”温迪一边把wasabi拌到豆酱里以用作寿司馅一边说道“一切都搞定了吗”我出神地盯着手上那根加利福尼亚春卷约一分钟后“是安娜”我承认“自从我知道她是鲍勃的女儿后我就开始回避她。她隔不多久就呼我但我都不回。我把她的电话号码从我的PDA中删除了我喜欢她但我不知道我能不能处理…”“安娜上周末在我的婴儿浴室”温迪善解人意地点点头“她确实很喜欢你。”她见我没吭声又接着说“我想告诉你我对她说了些什么。我刚认识我丈夫的时候当时我常常加班加得很晚。那家公司是属于很注重必须按时完工的那种你知道吗总之汤姆常常约我出去我也很想这样但我经常不得不加班。最后我决定协调好时间。接下来的事正如他们所说都已成了历史。汤姆从不放弃所以我告诉安娜也不要气馁。坚持(persistence)就是胜利。”“得了不要跟我说persistence”我心烦意乱地说道。温迪眨了眨眼“嗯”“哦”我摇了摇头“我正试图在我的类层次结构中实现一些简单的对象persistence。我还没有想出该怎么来做。我请教Guru可她说我该知道的她都已教给了我。我真的想不出是怎么回事。”温迪抿了抿唇稍思片刻“我们曾有协定午饭期间不谈工作今天就破一下例吧。你说得详细一点。”“我知道其实并不太难”我嘴里含着一大口饭说道“每次当我开始干时我知道我能搞定。主应用程序能够实例化派生类。我需要把那个类写到ostream也没问题。但当我想把它读回再重新构造成正确的类时就遇到麻烦了。”“Guru没说错你该知道的确实已经知道了。你怎么来创建对象呢不到运行时刻你并不知道对象的确切类型啊”“使用类工厂class factory。”我说。“不错就象你上个月[2]所实现的那个一样。现在你给类工厂传递什么东西来获得合适的类型”“一些标志。我用了std::string。”“好那你是从哪里取得那些标志的呢”“嗯……是这样总不会是凭空捏造的我想是从文件中读取的吧。”就在些时我突发灵感“对就是这样。当我写出对象时我首先写出一些标志标明该对象的确切类型接着再写入对象的信息。在重新构建对象时读取这些标志-将它传递给类工厂-从文件流读入这些都是很简单的呀。”“对”温迪回答说“如果你想干得漂亮一点你可以……”“保留这些标志”我作了个暂停的手势“谢谢你帮助我清理混乱的思路。现在很清楚了我想重新遵守我们之间‘午餐期间不谈正事’的协定。”我开始细心品味那道主菜。稍后当温迪和我回到办公室时我坐在计算机旁相当轻松就整理出基类class Base{private:// … 一些数据与本主题无关 …virtual std::string classID() const { return Base; }protected:// 当派生类装入自身后应该调用该函数的父类实现。virtual void do_read( std::istream );// 当派生类保存完自身后应该调用该函数的父类实现。virtual void do_write( std::ostream ) const;public:// … 需要实现的一些虚拟函数与本主题无关…// Streaming functions.void read( std::istream );void write( std::ostream ) const;virtual ~Base();};// 流处理过程中的几个帮助函数。注意它们并非友元std::ostream operator ( std::ostream o, const Base b) { b.write(o); }std::istream operator ( std::istream o, Base b) { b.read(o); }// [3]“很好我的孩子”Guru的声音又在我的身后响起。我从椅子上蹦了起来责怪自己怎会没有想到她的来访。她接着说“把你的成果简单地跟我说说。”“很简单”等Guru坐到客椅上我回答说“通过重载的操作符Base::write会被调用这里是它的实现”void Base::write( std::ostream o ) const{o classID() std::endl;do_write(o);}“嗯模板方法模式Template Tethod pattern”Guru点点头“你真聪明我的孩子[4]。”“实现也相当简单”我继续说“简单地写出类标识符接着触发do_write虚拟函数。do_write函数负责处理那些把对象信息写入流的细节。每个派生类必须调用其父类的do_write函数。不过读入要稍微复杂一些。”我打开那个用于封装读入的函数std::auto_ptrBase loadBase( std::istream inFile ){std::string className;std::getline( inFile, className );std::auto_ptrBase newBase genericFactoryBase::instance().create(className);if( newBase.get() ! 0 ) {inFile *newBase;}return newBase;}“这是一个三步骤的过程。首先我从文件中取得类的ID。接着我用这个ID从类工厂中得到一个新对象。最后我通过read函数重新构建类的数据”void Base::read( std::istream i ){do_read(i);}“这里我也用了模板方法模式但对于这样的简单函数有点牛刀杀鸡的感觉。当然do_read负责处理读入和确认信息等麻烦活。派生类的do_read应当调用其父类的do_read函数。”“干得好我的孩子”Guru起身说道。“请稍候”我脱口而出Guru停住脚步。“告诉安娜我丢了她的电话号码不过我今晚在家她可以打电话给我。”Guru点点头转身离去。“‘泄气’哈。”又是吉尔伯的声音。我眨眨眼摇摇头努力驱赶袭上心头的睡意。“他们知道些什么”“我想不会太多那些亚洲人似乎怀疑到什么。”“他们难道不相信我们的掩饰说法我们对他们说的是由于通信故障正好切断了他们与其同胞的通话。”吉尔伯的声音明显带有讽刺的味道。“他们有所怀疑”另一个声音重复道“他们正过来呢我们要处理好这事。目前为止你的技术队伍发现了什么”站在走廊上我越来越困不想再听下去了。舒舒服服睡一晚也还来得及。[感谢]我们要感谢Andrei Alexandrescu他提出了一个虽然不大但很重要的问题就是我们以前文章中的命名问题。我们错误地将GoF(“Gang of Four”(四人帮)即《设计模式》的四位作者)的“Factory Method”设计模式称为“Abstract Factory”模式。这些模式在Andrei的著作《Modern C Design》Addison-Wesley,2001中都有专门的一章来讲述。对可能引起的混淆我们表示歉意。[注释][1]可按“How to Handle a Woman”(Camlot, Lerner和Loewe)的调子来唱。[2] Jim Hyslop和Herb Sutter. Conversations: A Factory, Template Style, C/C Users Journal C Experts Forum, 2001年7月, www.cuj.com/experts/1906/hyslop.htm.[3]可到hyslop.zip下载完整的可工作的例子程序。[4] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley, 1995).中文名《设计模式》
Java锁机制 概述 按实现层面划分 [内置锁]:synchronized是JVM层面实现的,无需手动释放锁,属于内置锁。[显式锁]:ReentrantLock为代表的显式锁,需要手动释放锁,功能更加灵活,位于java.util.concurrent.lock… 2026/7/6 20:49:45
计算机毕业设计springboot文档查重系统 完善诚信建设系统文档以满足检查要求基于SpringBoot的毕业论文相似度检测平台 基于SpringBoot的学术文献原创性审核系统 计算机毕业设计springboot文档查重系统vhg01b87 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 在数字化时代,文档的编写和传播变得前所未有地便捷,这也… 2026/7/5 16:35:17
不同工况DST FUDS HPPC电池参数在线辩识,包括一阶模型,二阶模型,带ocv同时参数辩识 不同工况DST FUDS HPPC电池参数在线辩识,包括一阶模型,二阶模型,带ocv同时参数辩识,EKF ffrls两种在线辩识算法。 参数辩识加容量同时在线辩识,附赠simulink模型用于仿真验证。电池模型在线辨识这玩意儿,搞… 2026/5/17 1:13:25
Bloome多Agent协作平台:AI智能体协同工作流实战指南 在AI技术快速发展的今天,开发者们经常面临一个痛点:单个AI助手虽然强大,但在复杂任务中往往显得力不从心,需要我们在不同工具间频繁切换,上下文信息难以共享。Bloome作为新兴的多Agent协作消息平台,正是为了… 2026/7/11 7:55:17
Qt 6.11.1 QTableWidget 实战:5步构建可编辑数据表格(附完整代码) Qt 6.11.1 QTableWidget 实战:5步构建可编辑数据表格(附完整代码)在桌面应用开发中,数据表格是最常见的UI组件之一。Qt框架提供的QTableWidget控件,让开发者能够快速实现功能完善的数据展示与编辑界面。本文将带你从零… 2026/7/11 7:53:16
Linux C++ 生产者消费者模型:3种同步机制对比与性能实测 Linux C 生产者消费者模型:3种同步机制对比与性能实测在并发编程领域,生产者消费者模型堪称多线程协作的"Hello World"。但当你真正将其应用于高吞吐量、低延迟的Linux C项目时,会发现简单的pthread实现往往难以满足性能需求。本文… 2026/7/11 7:51:15
Zynq PS 时钟子系统功耗优化:3 种 PLL 配置模式对比与实测分析 Zynq PS 时钟子系统功耗优化:3 种 PLL 配置模式对比与实测分析在嵌入式系统设计中,功耗优化一直是工程师们关注的重点。对于采用Xilinx Zynq系列SoC的设计来说,处理系统(PS)的时钟子系统功耗占据了整体功耗的相当比例。… 2026/7/11 7:51:15
OpenClaw与Hermes Agent框架深度对比:架构同构、选型避坑与医疗场景落地指南 1. 项目概述:当两个开源Agent框架在GitHub上“撞脸”最近在AI工程圈里,一个词频繁出现在技术群、PR评论区和深夜的Stack Overflow搜索记录里——OpenClaw和Hermes Agent。不是新发布的模型权重,也不是某家大厂的闭源平台,而是两个… 2026/7/11 7:51:15
Node.js 18.x 环境配置:Windows/Linux 双平台安装与 npm 版本验证 3 要点 Node.js 18.x 全栈开发环境配置指南:从安装到项目部署为什么选择Node.js 18.x作为开发基石Node.js 18.x是当前长期支持版本(LTS),它带来了多项关键改进:V8引擎升级到10.1、全局fetch API的引入、以及核心模块的性能优化… 2026/7/11 7:47:15
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08