2006年04月
在这一章里面将会讨论到该撤销和重做库的序列化问题。序列化几乎是每一个应用程
序中都会考虑到的问题,在本系列文档的开始就已经提到了该撤销和重做库天生具备了序列化能力,那么在本文中将会详细的讨论序列化的问题。并且尽可能的给出非常具有弹性的序列化框架。
阅读全文>
发表于 @ 2006年04月28日 18:15:00|评论(loading...)|编辑
在上一章里面讨论了代码的自动生成机制,经常会遇到根据不同的类型选择不同的操
作的情况,也就是静态分派的问题。这就需要有一种机制用来识别不同的类型,在本章里面将会系统的讨论C++里面可用的类型识别问题。
阅读全文>
发表于 @ 2006年04月24日 19:55:00|评论(loading...)|编辑
本来这一章是要讨论对前一章里面封装的控制面板类进行STL算法兼容性讨论的,但是在讨论这个问题之前发现前一章里面对客户端的代码编写有一个特别的要求:简单类型和复合类型必须用前一章里面的分隔符进行分隔,这就要对客户端编码规范进行限制。这是一个对库的使用者的限制,但是本撤销和重做库的目标之一就是尽可能少的给出使用该库的规则,降低库的使用者的使用门槛。因此也就自然而然的想到了,这个额外的规范到底是不是必须的,实际上在编写前一章的时候已经考虑过这个问题,因为当时还没有解决方案,所以就给出了上一章里面的简单方案,但是经过一晚上的考虑之后(参看了《Modern C++ Design》),终于发现上面的这个规范是不必要的,因此在这一章里面将会重新考虑这个没有上面的编码规范的方案。有了这一章讨论的这个方案,客户端的编码将会更加自由。
阅读全文>
发表于 @ 2006年04月24日 10:41:00|评论(loading...)|编辑
在上一章里面已经成功的封装了复合类型,基本上已经具备了应用的基础。在这一章
里面将会尝试对前面讨论的简单类型和复合类型进行应用,同时也是进一步的进行封装的过程。通过提供一个统一的应用界面就可以使客户端不必区别处理简单类型和复合类型之间的各个操作的不同,而是由库来处理这种不同,这正是体现C++自动化(模板元)编程的优势的时候了。在这一章中将会讨论这个封装过程。
阅读全文>
发表于 @ 2006年04月23日 17:09:00|评论(loading...)|编辑
在这一章里面将会讲解如何派生上一章里面所讲解的复合类,生成自己特殊的复合类
。生成这种特殊的复合类的派生类的目的就是为了方便使用者能够方便的添加自己的操作,同时也是为了生成相应的类型。实际上需要对前一篇文章里面的的compound类进行修改。
阅读全文>
发表于 @ 2006年04月22日 12:48:00|评论(loading...)|编辑
在上一章里面讨论了复合对象的问题。RoundRectangle类(b)方案是一个复合类方案,从上一章的内容我们可以看出虽然实现了一个RoundRectangle类确实是一个复合类,但是实现复合类是一个比较繁琐的事情,对于一个程序里面有很多这种类的情况,那么前一章里面的编码过程将会是一个非常繁琐的体力劳动。在这一章里面将使用模板元编程将这种繁琐的体力劳动自动化。阅读全文>
发表于 @ 2006年04月20日 09:43:00|评论(loading...)|编辑
在上一篇文章里面讨论了C++里面的代码生成技术,使用的是scatter,不过上一篇文章里面也提到了,前一篇文章里面讨论的代码生成模板scatter使用的类型串绝对不允许重复。其实上一篇中的scatter使用由重复的类型的类型串也是能够正常生成代码的,不过产生的代码却不能将类型重复的变量分辨出来,这样生成的代码就没有了什么实际意义,所以在这一章中将要解决的问题是:重新编写一个可以使用重复类型的类型串生成代码,并且能够采用一定的方法将这些生成的变量分辨出来。
阅读全文>
发表于 @ 2006年04月20日 09:41:00|评论(loading...)|编辑
在CSDN上有一个网友问道下面的这个问题:
我想查找一个文本文件中的字符串所在的行并输出行数!
在此我给出一个比较简洁的方案如代码CODE1所示:
阅读全文>
发表于 @ 2006年04月18日 22:40:00|评论(loading...)|编辑
这一章,我们将要开始的讨论C++里面的代码生成技术。说起代码生成技术,实际上这并不是C++的专利,作为C++子集的C语言早就已经使用了一定的代码生成技术,这就是C宏。我想C宏大家应该非常熟悉了吧,特别是能够实现带参数的宏使得大量的库利用这种技术来生成那些格式重复的代码,例如:微软的MFC库,跨平台的GUI库wxWidget,Boost库等等都使用了C宏。虽然C宏在这些库里面扮演了非常重要的角色,并且仍将扮演非常重要的角色,但是也不得不说:C宏存在着很大的问题。最基础的就是类型不安全性,这也是C++里面出现模板语素的一个比较重要的原因。更重要的是使用C宏生成的代码仅仅只是实现了简单的格式填空能力,并不能表达特定的算法。正是C宏的表达设计思想的不足限制了C宏的使用范围。这就是模板元发挥威力的时候了,见文章:)
阅读全文>
发表于 @ 2006年04月18日 12:04:00|评论(loading...)|编辑
在这一章里面对前面的模板元编程的过程进行了总结,其中静态循环过程只能够直接操纵整数类型,但是C++模板元自动化编程需要静态循环过程能够操作类型数据而不是整数,在这一章中就成功的实现了利用前一章里面的LOOP静态循环间接实现了这种类型的遍历过程。这种遍历过程的实现也是为下一章的自动生成的代码实现任意的操作而准备的。这是理论走向实践的关键所在。阅读全文>
发表于 @ 2006年04月17日 20:17:00|评论(loading...)|编辑
在上一篇文章的最后提到了一个相对来说通用一点的LOOP循环,在本篇中详细介绍了一个比较通用的LOOP静态循环的演化过程,通过这个过程可以比较清晰的理解模板是怎样一步一步的实现循环过程的,其中还包括了一些常用的C++技术,例如:通过外加一层包裹层来解决问题的方法等等。通过阅读本文,可以在具体的应用中实现你想要的任何静态循环过程,这里介绍的是一种比较通用的方法,主要是起到抛砖引玉的效果:)
阅读全文>
发表于 @ 2006年04月16日 22:01:00|评论(loading...)|编辑
大家都知道C++是一们计算机语言,这一点也没错,但是你知道C++里面还包含了另外一种子语言么?呵呵,恐怕知道的人就不多了,会用的人就更少了。但是既然经过了这么多年的发展,C++语言里面出现了这种子语言(模板)自然有它的根源的,这一点并不是本文中将要讨论的,如果想了解C++的发展例程,可以参见相关的文献。
阅读全文>
发表于 @ 2006年04月16日 13:45:00|评论(loading...)|编辑
在本章中解释了简单对象和复合对象的概念,并且给出了复合对象圆角矩形(RoundRectangle)类的具体实现,作为例子,本章中的代码不具备有通用性,但是却是为写出通用性的代码做了铺垫,后续的文章中将会大量使用模板元编程实现自动化编程,就是为了能够将这些不能够用通常的方式写成通用代码的代码写成通用的代码形式。总之一条:让库的使用者使用起来尽可能的简单:)阅读全文>
发表于 @ 2006年04月15日 16:32:00|评论(loading...)|编辑
在通常的编程问题中经常会遇到使用宏的情况,但是在很多的情况下C宏又非常的不方便,在自动化编程方面,使用宏就非常不方便了,甚至不可能了,下面我们将要考虑一个C宏不可以做到的事情如何使用模板元编程来实现。在本文中将会以一个具体的例子展示这种自动化方法,希望能够起到抛砖引玉的效果:)
阅读全文>
发表于 @ 2006年04月14日 18:38:00|评论(loading...)|编辑
在前一章中已经成功的封装了三个基本操作成为基本命令,同时也封装了复合操作
成为复合命令,另外对这些基本的命令的使用进行了更进一步的封装,使得客户端编写的代码更易理解。虽然已经基本上具备了编写撤销和重做的能力,但是使用的时候还是会因为不能够准确的分配相应的标识号而困扰。因此在本章中对标识号进行系统的讨论;并给出相应的实现和测试代码。
阅读全文>
发表于 @ 2006年04月12日 12:51:00|评论(loading...)|编辑
在编写数值计算程序的过程中,经常需要大量的数值输入,通常来说是:一个程序用
于产生数据,另一个程序用来接收产生的数据作为输入。通常的做法是采用文件操作,但
是在我编写数值计算的过程中发现:C++中还可以用更加简单直接的方式实现这种数据传送
的目的。这种方法就是直接使用C++流库具备的输入输出能力,使得编码过程尽可能的简单
,这样就可以更加专注于算法的实现。
阅读全文>
发表于 @ 2006年04月08日 12:23:00|评论(loading...)|编辑
在上一篇文章中已经成功的将三个基本操作封装为三个基本命令,同时也将一个复合
操作封装成了一个复合命令,另外也给出了简单的使用代码;从代码中可以看出,撤销和重做的过程还是比较晦涩,用户为了表达撤销和重做的过程还需要编写很多的额外代码,而且这种代码也没有很直接的表达撤销和重做的思想。为了更好的表达撤销和重做机制,并且更加简化客户端代码的书写,在本章中将会对前一章中给出的代码进行更深入的封装,让客户端编写的代码尽可能的少,同时也能构更加直接的表达撤销和重做的意思。
阅读全文>
发表于 @ 2006年04月07日 13:22:00|评论(loading...)|编辑
在编写C程序或者C++程序的时候经常会用到多重循环,而我们经常为了代码的可读性
在每一个子循环的开头都给出一个跳格键的缩进,但是当循环嵌套的比较多的时候,
将会出现前导的大量空白,这在编写数值计算程序的时候经常会遇到,这些前导的大量空
白和大量的循环代码将真正的算法代码淹没了,导致编写数值计算程序的过程非常烦杂,
而通过本文所介绍的采用C宏展开的方式就可以很好的解决循环框架代码远远多于算法代码
而导致的混乱。因为是宏展开,所以和手工编写的多重循环是一回事,也就是说经过宏处
理器之后的代码和手工直接编码产生的循环是一摸一样的,所以效率上没有任何的损失的。
阅读全文>
发表于 @ 2006年04月06日 14:06:00|评论(loading...)|编辑
本文中实现了三个基本操作的对象化,同时也完成了复合操作的对象化;撤销和重做的概念在代码中已经可以比较清晰的表达出来了,比前一篇文章中的表达方式清晰明了多了;更重要的是在完成了三个基本操作的对象化之后给出了复合命令的对象化,并给初始了示例代码;在本文的最后还总结了使用这些对象化出来的命令的使用规范。阅读全文>
发表于 @ 2006年04月04日 14:48:00|评论(loading...)|编辑
在用C++编写应用程序的过程中,经常涉及到序列化的问题,但是序列化的问题通常都
会有非常繁琐的过程代码需要书写,本文中就是通过使用STL经过简单的步骤实现了程序的序列化问题
,简单直接,和其它的序列化方案有着很大的不同。阅读全文>
发表于 @ 2006年04月03日 21:59:00|评论(loading...)|编辑
在C++中编写类的过程中经常搞不清楚什么时候需要虚拟析构函数,什么时候可以省略,本文中就对常见的7种情况分别进行了讨论,并分别得到了相应的结论。值得注意的是这里的讨论在g++编译器和VC8编译器cl种得到了一致的结果。阅读全文>
发表于 @ 2006年04月03日 12:57:00|评论(loading...)|编辑
在本文中讨论了撤销和重做所必须处理的问题,并且因此而得出使用三个基本命令和一个复合命令即可表示一个应用程序所能够使用的所有的操作,只需要对这个三个基本命令和一个复合命令进行比较好的探讨和封装,使这四个命令具备有撤销和重做的能力。然后用这四个命令来表示应用程序中的所有的操作,那么很显然,该应用程序将会具备有撤销和重做的能力。可以看出,这里既有上一篇文章中讨论的“仿函数保存反操作法”的空间和时间优势,又没有“仿函数保存反操作法”为每一个操作书写反操作的繁琐情况。具体细节可以参见本文及相关文档!阅读全文>
发表于 @ 2006年04月03日 10:26:00|评论(loading...)|编辑
经过一年多的时间的摸索,终于找到了一种比较完美的撤销和重做(Undo和Redo)的C++实现方案,因为现在很多的应用程序都需要这种功能,所以我将我的经历写出来让大家分享,同时也能够让更多的人帮助我来更加完善这种架构,同时也能够让更多的人能够利用这种架构更好的完成它的程序。这种架构充分利用了STL的容器和算法来简化代码,因此有着比较高的正确性和可读性。阅读全文>
发表于 @ 2006年04月02日 12:30:00|评论(loading...)|编辑
在前面曾经实现了自定义STL兼容插入器的方法实现了过滤器,过滤器的方法看不出实现这个过滤器有何优点,例如过滤器可以由STL的partition算法同样实现。但是这里的分流器则是其它的单独的STL算法所不能够表达的。实际上这里的分流器可以这样来看,前面的过滤器仅仅只是一个源一个过滤流,而分流器则是一个源多个过滤流,如果采用STL的两个源的算法则可以实现两个源多个过滤流的分流器!为了简单起见本文中仅仅实现一个源两个过滤流的情况,其它情况可以类似实现!:)阅读全文>
发表于 @ 2006年04月02日 11:31:00|评论(loading...)|编辑
采用了更加接近STL容器概念的虚拟容器类重新实现了前面的虚拟游标容器类的关于梯形公式分半法求积分的方法。阅读全文>
发表于 @ 2006年04月02日 11:24:00|评论(loading...)|编辑
相对于前一篇的虚拟游标容器的方法,在这里采用更接近于STL容器类型的虚拟容器类“dummy.h”文件中的dummy模板实现同样的功能。这样之后,从代码上看更加复合STL惯例。关于“dummy.h”的内容可以参见我的“自定义STL游标实现虚拟容器”的相关文档,其中有着“dummy.h”的源代码。阅读全文>
发表于 @ 2006年04月02日 10:51:00|评论(loading...)|编辑
在STL中,有这样的三个模板起着向容器中动态添加元素的的功能,这三个模板类是:back_insert_iterator、front_insert_iterator和insert_iterator,为了方便使用,STL还定义了三个相应的辅助函数:back_inserter、front_inserter和inserter,在本文中讨论了怎样自定义一个类似的插入器,在向容器中插入元素的时候使用仿函数来进行条件判断,这样就可以很容易的实现一个STL兼容的插入器,从而也就实现了过滤的功能,我称其为过滤器。阅读全文>
发表于 @ 2006年04月02日 09:39:00|评论(loading...)|编辑
将虚拟容器类dummy设置成为单独的头文件使用,这个头文件是“dummy.h”,本文中的代码就是这个头文件的实现,如果需要直接使用的话,可以直接将本文中的代码复制到文本文件中,给该文本文件取名为“dummy.h”即可。阅读全文>
发表于 @ 2006年04月01日 22:11:00|评论(loading...)|编辑
到了这里才使得虚拟容器成为形式上最接近STL容器的容器类型,该文件是一个测试文件,如果需要将dummy容器类作为一个模块类使用,则只需要将该文件的测试部分注释掉,并且添加头文件必须的宏处理“#pragma once”即可!为了同一起见,这个头文件,我命名为:"dummy.h",表示虚拟容器的意思。这一点是为了和前面的虚拟游标容器相区别!阅读全文>
发表于 @ 2006年04月01日 21:36:00|评论(loading...)|编辑