做我女朋网站源码珠海市建设工程信息网

diannao/2026/1/23 2:15:56/文章来源:
做我女朋网站源码,珠海市建设工程信息网,网站的点击率,app一键生成器MFC 六大关键技术 ( 第四部分 ) ——永久保存#xff08;串行化#xff09; 先用一句话来说明永久保存的重要#xff1a;弄懂它以后#xff0c;你就越来越像个程序员了#xff01; 如果我们的程序不需要永久保存#xff0c;那几乎可以肯定是一个小玩儿。那怕我们的记事本…MFC 六大关键技术 ( 第四部分 ) ——永久保存串行化 先用一句话来说明永久保存的重要弄懂它以后你就越来越像个程序员了 如果我们的程序不需要永久保存那几乎可以肯定是一个小玩儿。那怕我们的记事本、画图等小程序也需要保存才有真正的意义。 对于 MFC 的很多地方我不甚满意总觉得它喜欢拿一组低能而神秘的宏来故弄玄虚但对于它的连续存储 serialize 机制却是我十分钟爱的地方。在此可让大家感受到面向对象的幸福。 MFC 的连续存储 serialize 机制俗称串行化。“在你的程序中尽管有着各种各样的数据 serialize 机制会象流水一样按顺序存储到单一的文件中而又能按顺序地取出变成各种不同的对象数据。”不知我在说上面这一句话的时候大家有什么反应可能很多朋友直觉是一件很简单的事情只是说了一个“爽”字就没有下文了。 要 实现象流水一样存储其实是一个很大的难题。试想在我们的程序里有各式各样的对象数据。如画图程序中里面设计了点类矩形类圆形类等等它们的绘图方 式及对数据的处理各不相同用它们实现了成百上千的对象之后如何存储起来不想由可一想头都大了我们要在程序中设计函数 store() 在我们单击“文件 / 保存”时能把各对象往里存储。那么这个 store() 函数要神通广大它能清楚地知道我们设计的是什么样的类产生什么样的对象。大家可能并不觉得这是一件很困难的事情程序有能力知道我们的类的样子对象也不过是一块初始化了存储区域罢了。就把一大堆对象“转换”成磁盘文件就行了。 即使上面的存储能成立但当我们单击“文件 / 打开”时程序当然不能预测用户想打开哪个文件并且当打开文件的时候要根据你那一大堆垃圾数据 new 出数百个对象还原为你原来存储时的样子你又该怎么做呢 试 想要是我们有一个能容纳各种不同对象的容器这样用户用我们的应用程序打开一个磁盘文件时就可以把文件的内容读进我们程序的容器中。把磁盘文件读进 内存然后识别它“是什么对象”是一件很难的事情。首先保存过程不像电影的胶片把景物直接映射进去然后看一下胶片就知道那是什么内容。可能有朋友 说它象录像磁带拿着录像带我们看不出里面变化的磁场信号但经过录像机就能把它还原出来。 其实不是这样的比如保存一个矩形程序并不是把矩形本身按点阵存储到磁盘中因为我们绘制矩形的整个过程只不过是调用一个 GDI 函数罢了。它保存只是坐标值、线宽和某些标记等。程序面对“ 00 FF ”这样的东西当然不知道它是一个圆或是一个字符 拿 刚才录像带的例子我们之所以能最后放映出来前提我们知道这对象是“录像带”即确定了它是什么类对象。如果我们事先只知道它“里面保存有东西但不知 道它是什么类型的东西”这就导致我们无法把它读出来。拿录像带到录音机去放对录音机来说那完全是垃圾数据。即是说要了解永久保存要对动态创建有 深刻的认识。 现在大家可以知道困难的根源了吧。我们在写程序的时候会不断创造新的类构造新的对象。这些对象当然是旧的类对象如 MyDocument 从未见过的。那么我们如何才能使文档对象可以保存自己新对象呢又能动态创建自己新的类对象呢 许多朋友在这个时候想起了 CObject 这个类也想到了虚函数的概念。于是以为自己“大致了解”串行化的概念。他们设想“我们设计的 MyClass 我们想用于串行化的对象全部从 CObject 类派生 CObject 类对象当然是 MyDocument 能认识的。”这样就实现了一个目的本来 MyDocument 不能识别我们创建的 MyClass 对象但它能识别CObject 类对象。由于 MyClass 从 CObject 类派生我产的新类对象“是一个 CObject ”所以 MyDocument 能把我们的新对象当作 CObiect 对象读出。或者根据书本上所说的打开或保存文件的时候 MyDocument 会调用 Serialize  MyDocument 的 Serialize 函会呼叫我们创建类的 Serialize 函数 [ 即是在MyDocument Serialize 中调用m_pObject - Serialize() 注意在此m_pObject 是CObject 类指针它可以指向我们设计的类对象] 。最终结果是 MyDocument 的读出和保存变成了我们创建的类对象的读出和保存这种认识是不明朗的。 有意思还有在网上我遇到几位自以为懂了 Serialize 的朋友居然不约而同的犯了一个很低级得让人不可思议的错误。他们说 Serialize 太简单了 Serialize 是一个虚函数虚函数的作用就是“优先派生类的操作”。所以 MyDocument 不实现 Serialize 函数留给我们自己的 MyClass 对象去调用 Serialize ……真是哭笑不得我们创建的类 MyClass 并不是由 MyDocument 类派生 Serialize 函数为虚在 MyDocument 和 MyClass 之间没有任何意义。 MyClass 产生的 MyObject 对象仅仅是 MyDocument 的一个成员变量罢了。 话说回来由于 MyClass 从 CObject 派生所以CObject 类型指针能指向 MyClass 对象并且能够让 MyClass 对象执行某些函数特指重载的 CObject 虚函数但前提必须在 MyClass 对象实例化了即在内存中占领了一块存储区域之后。不过我们的问题恰恰就是在应用程序随便打开一个文件面对的是它不认识的 MyClass 类当然实例化不了对象。 幸好我们在上一节课中懂得了动态创建。即想要从CObject 派生的MyClass 成为可以动态创建的对象只要用到DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏就可以了注意最终可以Serialize 的对象仅仅用到了DECLARE_SERIAL/IMPLEMENT_SERIAL 宏这是因为DECLARE_SERIAL/IMPLEMENT_SERIAL 包含了DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏。 从解决上面的问题中我们可以分步理解了 1、   Serialize 的目的让 MyDocument 对象在执行打开 / 保存操作时能读出构造和保存它不认的 MyClass 类对象。 2、   MyDocument 对象在执行打开 / 保存操作时会调用它本身的 Serialize 函数。但不要指望它会自动保存和读出我们的 MyClass 类对象。这个问题很容易解决就直接在 MyDocument:: Serialize { // 在此函数调用MyClass 类的Serialize 就行了即 MyObject. Serialize ;        } 3、   我们希望 MyClass 对象为可以动态创建的对象所以要求在MyClass 类中加上DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏。 但目前的Serialize 机制还很抽象。我们仅仅知道了表面上的东西实际又是如何的呢下面作一个简单深刻的详解。 先看一下我们文档类的Serialize  void CMyDoc::Serialize(CArchive ar) {     if (ar.IsStoring())     {         // TODO: add storing code here     }     else     {         // TODO: add loading code here     } } 目前这个子数什么也没做没有数据的读出和写入CMyDoc 类正等待着我们去改写这个函数。现在假设CMyDoc 有一个MFC 可识别的成员变量m_MyVar, 那么函数就可改写成如下形式 void CMyDoc::Serialize(CArchive ar) {     if (ar.IsStoring())     // 读写判断     {         arm_MyVar;        // 写     }     else     {         arm_MyVar;        // 读     } } 许多网友问自己写的类即 MFC 未包含的类为什么不行我们在 CMyDoc 里包含自写类的头文件MyClass.h 这样CMyDoc 就认识MyDoc 类对象了。这是一般常识性的错误MyDoc 类认识MyClass 类对象与否并没有用关键是CArchive 类即对象ar 不认识MyClass 当然你梦想重写CArchive 类当别论。“ ”、“ ”都是CArchive 重载的操作符。上面arm_MyVar 说白即是在执行一个以ar 和m_MyVar 为参数的函数类似于function(ar,m_MyVar) 罢了。我们当然不能传递一个它不认识的参数类型也因此不会执行function(ar,m_MyObject) 了。 [ 注这里我们可以用指针。让MyClass 从Cobject 派生一切又起了质的变化假设我们定义了MyClass *pMyClass new MyClass; 因为MyClass 从CObject 派生根据虚函数原理pMyClass 也是一个CObject* 即pMyClass 指针是CArchive 类可认识的。所以执行上述function(ar, pMyClass) 即ar pMyClass 是没有太多的问题在保证了MyClass 对象可以动态创建的前提下。]   回过头来如果想让 MyClass 类对象能 Serialize 就得让MyClass 从CObject 派生Serialize 函数在CObject 里为虚MyClass 从CObject 派生之后就可以根据自己的要求去改写它象上面改写CMyDoc::Serialize 方法一样。这样MyClass 就得到了属于MyClass 自己特有的Serialize 函数。 现在程序就可以这样写 …… #include “MyClass.h” …… void CMyDoc::Serialize(CArchive ar) {     // 在此调用 MyClass 重写过的 Serialize()     m_MyObject. Serialize(ar);      // m_MyObject 为 MyClass 实例 } 至此串行化工作就算完成了一即简单直观从 CObject 派生自己的类重写 Serialize  。在此过程中我刻意安排在没有用到 DECLARE_SERIAL/IMPLEMENT_SERIAL 宏也没有用到CArray 等模板类的前提下就完成了串行化的工作。我看过某些书总是一开始就讲DECLARE_SERIAL/IMPLEMENT_SERIAL 宏或马上用CArray 模板让读者觉得串行化就是这两个东西导致许多朋友因此找不着北。 大家看到了没有DECLARE_SERIAL/IMPLEMENT_SERIAL 宏和CArray 等数据结构模板也依然可以完成串行化工作。   现在可以腾出时间讲一下大家觉得十分抽象的 CArchive 。我们先看以下程序注以下程序包含动态创建等请包含DECLARE_SERIAL/IMPLEMENT_SERIAL 宏 void MyClass ::Serialize(CArchive ar) {     if (ar.IsStoring())     // 读写判断     {         ar m_pMyVar;      // 问题ar 如何把m_pMyVar 所指的对象变量保存到磁盘     }     else     {         pMyClass new MyClass; // 准备存储空间         ar m_pMyVar;          } } 要回答上面的问题即“ arXXX ”的问题。和 我们得看一下模拟 CArchive 的代码。 “arXXX ”是执行CArchive 对运算符“ ”的重载动作。ar 和XXX 都是该重载函数中的一参数而已。函数大致如下 CArchive operator( CArchive ar, const CObject* pOb) {     …………         // 以下为CRuntimeClass 链表中找到、识别pOb 资料。         CRuntimeClass* pClassRef pOb-GetRuntimeClass();         // 保存pClassRef 即类信息略                 ((CObject*)pOb)-Serialize();// 保存MyClass 数据     ………… } 从上面可以看出因为 Serialize() 为虚函数即“arXXX ”的结果是执行了XXX 所指向对象本身的Serialize() 。对于“arXXX ”虽然不是“arXXX ”逆过程大家可能根据动态创建和虚函数的原理料想到它。 至此永久保存算是写完了。在此过程中我一直努力用最少的代码详尽的解释来说明问题。以前我为本课题写过一个版本并在几个论坛上发表过但不知怎么在网上遗失可能被删除。所以这篇文章是我重写的版本。记得第一个版本中我是对DECLARE_SERIAL/IMPLEMENT_SERIAL 和可串行化的数组及链表对象说了许多。这个版本中我对DECLARE_SERIAL/IMPLEMENT_SERIAL 其中奥秘几乎一句不提目的是让大家能找到中心有更简洁的永久保存的概念我觉得这种感觉很好 摘自http://blog.csdn.net/liyi268/archive/2006/03/13/623367.aspx转载于:https://www.cnblogs.com/lzjsky/archive/2010/11/24/1886503.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress 忘记数据库密码破解百度seo推广价格

目录 参数复制文件然后进行同时复制操作 给定内容生成文件,并制定权限验证 关于覆盖先查看当前内容覆盖并备份查看文件权限 还有有没有备份查看文件内容 参数 这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。   其相关选项…

摄影类手机网站模板步骤英文

DNS过滤 URL过滤和DNS过滤对比

网站建设合同违约条款wordpress插件排列

http://blog.jobbole.com/65218/ 本文由 伯乐在线 - 熊崽Kevin 翻译自 pypix.com。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构。换句话说,数据结构是用来存储一系列关联数据的…

茂名小学网站建设三合一网站建设是指

算法学习——华为机考题库3(HJ21 - HJ30) HJ21 简单密码 描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,把密码…

公司建网站需要先注册域名龙岗 营销型网站建设

工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1、 号称功能: 内存泄露检测 (检测未释放内存, 即 动态内存开辟未释放的情况) 2、 检测 多次调用free&…

门户网站布局个人主页图片

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

手把手网站开发网页编辑的软件工具包括

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库! 在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!当admin.system.users一个用户…

建站城律师做网络推广哪个网站好

微软刚刚在 Visual Studio Code 网站上宣布了“动态分享”(Live Share)功能,开发者们可以在 VS 2017 或 VS Code 中体验全新的实施协作。微软表示,Live Share 可让团队在相同的代码库上启用快速协作,而无需同步代码或配…

公司网站建设要求网站添加 百度商桥

因为本人的专业是财务方面的,而且目前也是在从事着财务管理的工作,在一家技术型的公司。平常与那些技术人员接触时,发现他们常常过多地关注于技术,而对与自己息息相关的财税知识却知之甚少。在不出现什么情况的时候,当…

科技网站建设 开题报告新产品开发流程管理

分页查询算是比较常用的一个查询了在DAO层主要是查两个数据第一个总条数第二个要查询起始记录数到查询的条数当第一次点击查询时候(非下一页时Page类里面预设的就是 index就是0 pageSize是预设值当点击下一页的时候 index 和 pageSize带的就是页面上面给的值了分页的页面一般的…

海南省做购房合同网站全国做网站的公司

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist,并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

网站建设尺寸wordpress 3d标签

一 HBase简介与环境部署 1.1 HBase简介&在Hadoop生态中的地位 1.1.1 什么是HBase HBase是一个分布式的、面向列的开源数据库HBase是Google BigTable的开源实现HBase不同于一般的关系数据库, 适合非结构化数据存储 1.1.2 BigTable BigTable是Google设计的分布式数据存储…

网站排名优化在线培训云营销网站建设电话咨询

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者:机智的叉烧(OPPO算法工程师,擅长Query理解方向)背景搜索和推荐经常会被放在一起对比,其中最突出的区别就是搜索中存在query,需要充分考虑召回内容和query之间的…

怎么做网站网站怎样制作免费个人网页

文章目录 前言一、单选题二、填空题三、简答题总结前言 学习了项目的开发与发布之后,我们就可以单独对一个项目进行开发了,但是在企业中开发中,除了编码之外,还需要项目管理、团队协作开发等,这就是软件项目管理板块要学习的内容。本文是对《软件项目管理(第二版)》第 3…

网站建站的类型九江网站设计

【README】 消息中心的消息追踪需要使用 Trace 实现,Trace是 rabbitmq用于记录每一次发送的消息;方便开发者调试,排错。可通过插件形式提供可视化界面。 【1】 开启消息追踪 1)消息追踪通过 rabbitmq的插件 trace 来实现&#x…

襄阳网站建设电子商务论文

LiveGBS作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备 1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置 3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接…

相亲网站上做it的骗术榆林网站建设推广

1、首先net stop mysql服务,并且切换到任务管理器,有与mysql有关的,最好关闭进程。 2、运行CMD命令切换到MySql安装bin目录,下面是我的mysql安装目录 cd C:\Program Files\MySQL\MySQL Server 5.6\bin 接着执行mysqld --skip-gra…

江苏建设信息官网网站景安免费虚拟主机

正则化方法有如下几种: 一、参数范数惩罚 其中L2、L1参数正则化介绍与关系如下 1、L2 参数正则化 直观解释如下: 2、L1 参数正则化 二、获取更多数据(扩样本) 避免过拟合的基本方法之一是从数据源获得更多数据,当训练数…

婴儿衣服做的网站好房地产建筑公司网站

7-38 图着色问题 (25 分)图着色问题是一个著名的NP完全问题。给定无向图G(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配…

wordpress模板适合做什么站网站建设合作加盟

我在写项目的时候遇到了一个问题,就是在存商品id的时候我将它使用了JSON.stringify的格式转换了!!!于是便爆出了500这个错误!!! 我将JSON.stringify的格式去除之后,它就正常显示了&…