当前课程知识点:面向对象程序设计(C++) > 第五讲 找到对象,确定接口 > 5.3 接口在哪儿 > Video
刚才两个比较简单的例子
现在我们要
开始进入比较复杂的阶段了
那么在一个比较复杂的
这么一个问题里面
我们怎么样去分析接口是什么
好
这个是我们的目标
我们要做一个
旋转方阵填充的这么一个程序
大家看一下
我要填充成什么样
这是一个6乘6的方阵
然后填充的方式就是从左上角开始
先向下再向右再向上
再向左这么旋转着往里填
依次往里填
我们的要求是矩阵的大小
就是几乘几的这是随意的
比如说3乘3 5乘5
7乘7都可以
尺寸
这个大小N应该
在运行的时候输入的
我们的设计思路
这也是我们最常用的设计思路
就是从上而下设计
首先我从最广泛的
最上层去设计
我们是要做一个类
这个类是用来表示这个矩阵
这个类应该被怎么样去使用
我们看这一小段程序
这里面首先我们是要定义这个类
用一个size来定义这个类
来定义这个类的一个实例
叫obj
然后就调用obj的一个fill
这个fill就是来填充这个obj
填充这个方阵
然后再用cout
这个小于小于
就是这个流运算符
来把这个类
给它输出到标准输出上去
这就是我们希望这个类的使用方法
相应的大家注意啊
相应的就是这个类
应该具有的最基本的接口
好
那么这个
我们就根据这个
刚才这个我们期待这么使用它
我们就可以定义成这个matrix这个类
它应该接口是什么样子的
我们看一下
首先它的初始化的时候
你要输入一个整形变量size
然后它要有一个
fill这么一个成员函数
一个public成员函数
相应的它还要对这个
小于小于这个流运算符进行重载
那么我们就开始去实现这个接口吧
首先需要哪些成员变量
因为我们这个类方阵大小
是可变的呀
那我们就必须把这个方阵大小
这个参数记录下来
对吧
这是我们需要的一个参数
还有你一个matrix你一个矩阵
你肯定要有一定的数据空间
去存储它
因为我已经定了这个矩阵是多大
N乘N的
那我知道每行是多长
那我就没有要说
把所有的行都定义出来了
为了简单起见
我们就直接定义个一位宿主data
以行优先的方式
把这些数据存在一位宿主里边
然后我们去
实现这个类的构造函数
实现它的析构函数
还有这个流运算符
重载的流运算符
我们看这段程序
构造函数的实现其实也很简单
首先我们把这个size
要注意啊
这里面我的成员变量的定义
是用一个下划线开头的
而参数的定义是
没有这个下划线开头的
这样的好处是什么呢
使用者来讲
它比较容易理解这个参数
同时呢也不容易出现
成员变量和参数同名
造成数据使用不准确的问题
那我这里面首先
我这个构造函数里面
先把这个size给它初始化了
然后用new分配一个
size乘size这么大小的
一段整数宿主
最后这个matrix
把这个整数宿主给它都置为0
初始化嘛
析构函数也很简单
就是把这个data这段空间给它释放掉
然后这个流操作符这个输出
实际上则是属于常规的做法了
用一个二重循环
把所有的都给它输出出去
下面是最关键的部分了
怎么去实现那个填充
怎么实现填充
实际上我们看这段程序
看这个图
我们实质上就是从1开始
把所有的数字
挨个放到正确的位置上就行了
那么相应的我们注意到
它这个填充的次序
是不断发生变化的
先向下再向右
又向上
又向左
那么我们怎么样去确定某一个数字
是要填在哪呢
当我们这个时候
其实我们有一个办法
先不考虑怎么去填充它
我们先假设有一个辅助函数
已经写好了
放在那了
它能够给我们提供这个功能
就是说我确定一下
下一个数字该填哪
那么我这findposition这个函数
已经在这了
不知道怎么来的
反正来了
我们看有这么个函数了
然后我们这个fill里边
我们使用这个findposition这个函数
我们就可以
把这个fill这么给它实现了对吧
从1开始
到N的平方
依次的找到它的position
要注意啊
我这position是一个int型的
是我们是按一类宿主来存的嘛
对吧
那么我们这个一位宿主里面存它
找到这个位置
然后把对应这个数字写到这个位置上
findposition怎么实现呢
我们等会再看
-1.0 课程定位、教学内容
-1.0 课程定位、教学内容--作业
-1.1 编程环境与工具
--源程序拆分
-1.2 main函数的命令行参数
-作业一--作业
-2.1 变量定义
--变量定义
-2.2 变量的初始化、类型推导与基于范围的循环
-2.3 函数重载
--函数重载
-2.4 函数参数的缺省值与追踪返回类型的函数
-2.5 类的定义
--类的定义
-2.6 类成员的访问权限与友元
-第二讲 基础语法(1)--作业二
-3.1 构造函数析构函数
--构造函数析构函数
-3.2 赋值运算符重载
--赋值运算符重载
-3.3 流运算符重载
--流运算符重载
-3.4 函数运算符重载
--函数运算符重载
-3.5 下标运算符与自增减运算符重载
-3.6 静态成员与常量成员
-3.7 对象组合
--对象组合
-3.8 移动构造函数
--Video
--Video
-3.9 default修饰符
--Video
-第三讲 基础语法(2)--作业三
-4.1 继承
--Video
-4.2 函数重写
--Video
-4.3 虚函数
--Video
--Video
-4.4 自动类型转换
--Video
-4.5 禁止自动类型转换
--Video
-4.6 强制类型转换
--Video
-4.7 函数模板
--Video
-4.8 类模板
--Video
-4.9 成员函数模板
--Video
-4.10 模板特化
--Video
-作业四--作业
-5.0 引言
--Video
-5.1 从FOP到OOP
--Video
-5.2 对象在哪里
--Video
-5.3 接口在哪儿
--Video
-5.4 实现接口
--Video
-5.5 变与不变:多态的威力
--Video
-6.0 引言
--讨论
-6.1 从负载监视器的设计开始
-6.2 接口的分离与单一责任原则
-6.3 委托与接口的进一步分解
-6.4 分离不同层面的可变性
-7.0 引言
--Video
-7.1 迭代器
--Video
-7.2 迭代器的实现
--Video
-7.3 迭代器与模板
--Video
-7.4 算法与数据的解耦
--Video
-7.5 抽象结构与类模板
--Video
-7.6 函数对象与算法分解
--Video
-7.7 基于模板的策略模式
--Video
-8.0 引言
--Video
-8.1 已有资源的组合
--Video
-8.2 适当引入接口
--Video
-8.3 接口不变时的功能变化
--Video
-8.4 装饰
--Video
-8.5 责任的传递与责任链
--Video
-8.X 小结
--Video
-9.0 引言
--Video
-9.1 通过封装增加隔离、应对变化
--Video
--Video
-9.2 增加抽象层,应对变化
--Video
--Video
-9.3 相互关联对象的创建
--Video
-9.4 示例:自动组卷系统设计
--Video
-9.5 设计思路(上)
--Video
-9.6 设计思路(中)
--Video
-9.7 设计思路(下)
--Video
-9.X 小结
--Video
-课程总结
--Video
-期末考试--作业