理解C++面向对象程序设计中的抽象理论
断的寻找需要放弃的节点 { k++; for(int i = 0;i<interval;i++)//找需要放弃的节点位置 { cut_point=point;//存储截断位置指针 point=cut_point->next;//将point的指针移动到放弃的节点位置,此处也和while循环终止条件有关系 } cut_point->next=point->next;//将截断出的next指针设置成放弃处节点的next指针,使放弃处节点也就是不需要的节点脱离 cout<<"k:"<<k<<endl; } cout<<"\n最后的赢家:"<<endl<<point->number<<endl<<point<<endl<<point->next<<endl; delete[] josephus; cin.get(); cin.get(); } 此代码较为难以理解的部分就是while循环的终止条件的设置,如果读者没有能够理解好这部分注意看下面的图式帮助学习。 结构体的解法非常重要,对于我们全面理解面向对象的程序设计的抽象问题是基础,必须看明白我们才能够进行后面知识的学习,务必认真对待。 这段代码比较前一个程序,可读性上有所加强,但仍然不太容易理解! 为了更容易学习便于理解,我们的图例是以有两个小孩围成一圈,并且设置报数的数为1的情况来制作的。 上面的两种解决Josephus问题的解决办法从代码上来看,都属于一杆子到底的解法,第二种从结构表达上优于第一种,但是这两个都属于纯粹的过程式程序设计,程序虽然简短,但很难让人看懂,程序的可读性不高,在我们没有学习面向对象的编程之前,聪明的人可能会把各各步骤分解出来做成由几个函数来解决问题。 思路大致可以分为以下六个部分: 1.建立结构 2.初始化小孩总数,和数小孩的数 3.初始化链表并构成环链 4.开始通过循环数小孩获得得胜者 5.输出得胜者 6.返回堆内存空间 从表上看这个程序为了便于阅读可以写成六个函数来分别处理这六个过程,的确,这么修改过后程序的可读性是提高了一大步,但是有缺点仍然存在,程序完全暴露在外,任何人都可以修改程序,程序中的一些程序作者不希望使用者能够修改的对象暴露在外,各对象得不到任何的保护,不能保证程序在运行中不被意外修改,对于使用者来说还是需要具备解决Josephus问题算法的能力,一旦程序变的越来越很,,每一个参与开发的程序员都需要通读程序的所有部分,程序完全不具备黑盒效应,给多人的协作开发带来了很大的麻烦,几乎每个人都做了同样的重复劳动,这种为了解决一个分枝小问题写一个函数,最后由很多个解决局部问题的函数组合成的程序我们叫做结构化程序设计,结构化编程较过程化编程相比可读性是提高了,但程序不能轻易的被分割解决一个个大问题的模块,在主函数中使用他们的时候总是这个函数调用到那个函数,如果你并不是这些函数的作者就很难正确方便的使用这些函数,而且程序的变量重名问题带来的困扰也是很让人头痛的…… 那么面向对象的程序设计又是如何解决这些问题的呢? 面向对象的程序设计的思路是这样的: 程序 = 对象 + 对象 +对象.......... 这么组合而来的 对于上面的josephus问题可以把问题分割成如下的方法进行设计(如下图所示) 由上图可以看出: 面向对象的程序设计是由类组合而成的,有类必然有类的对象,程序之间的交互主要是通过对象与对象之间的关系进行操作的。 由于我们把josephus问题分解成了josephus类和ring类,在主函数中,用户只需要使用josephus类设计其对象明确知道Josephus类的外部接口函数也就是操作该对象的方法initial()就可以了,至于josephus的内部实现又是如何与Ring类进行操作的使用者一概不需要知道,只要拿来用知道接口和接口函数是什么就可以了,这样的程序设计很好的保护了各 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |