C++程序设计方法5:接口设计实例
//例子:旋转方阵填充,要求矩阵大小任意,尺寸在运行时输入
设计思路:从上到下
int main()
{
cout << "Please input N:";
int size;
cin >> size;
Matrix obj(size);//生成N*N矩阵
obj.fill();
cout <<obj;
return ;
} 设计类的接口:设计Matrix的接口
class Matrix
{
public:
Matrix(int size);
void fill();
friend osream& operator<<(ostream& out,const Matrix& m);
} 实现类的接口:确定成员变量
class Matrix
{
int _size;//方阵的规模
int *_data;//数据空间
public:
Matrix(int size);
~Matrix();
void fill();
friend ostream& operator<<(ostream& out,const Matrix& m);
}; 实现类的接口:实现构造函数,析构函数,和流输出操作符
Matrix::Matrix(int size):_size(size)
{
_data = new int[size * size];
memset(_data,,sizeof(int)*_size*_size);
} Matrix::~Matrix()
{
delete[] _data;
} ostream& operator<<(ostream& out,const Matrix& m)
{
for(int r = ; r < m._size; r++)
for(int c = ; c < m._size)
cout << *(m + r * m._size + c) << '\t';
cout << endl;
} 如何实现填充的成员函数,将从1开始的数字以此存放在正确的位置?
怎么确定某个待填充的数字的位置? 细化:增加一个辅助函数来计算并填充
class Matrix
{
int findPosition();//新增的辅助函数
public:
}; void Matrix::fill()
{
for(int num = ; num <=_size * _size; num++)
{
int pos = findPosition();
_data[pos] = num;
}
}
进一步分析:
每一个数字都与上一个数字相邻(上下左右,根据上一个数字位置和当前运动方向,可以确定其位置)
所以需要存储上一个位置和当前的运动方向
class Matrix
{
int row,col;
char dir; int findPosition();
public:
};
初始状态:初始方向为向下,那么在1之前,当前位置应该是在(-,)
Matrix::Matrix(int size):_size(size),row(-),col(),dir('D')
{
_data = new int[size*size];
} 下一个位置:根据上一个位置和当前的方向来确定
int Matrix::findPosition()
{
switch(dir)
{
case 'D':
if(row < _size- && _data[(row+)*_size + col] == )
row++;
else
{
dir = 'R';//next direction
col++;
}
break;
case 'R':
if(col < _size - && _data[row*_size + col + ] == )
col++;
else
{
dir = 'U';//next direction
row--;
}
break;
case 'U':
if(row > && _data[(row-) * _size + col] == )
row--;
else
{
dir = 'L';//next direction
col--;
}
break;
case 'L':
if(col > && _data[row * _size + col - ] == )
col--;
else
{
dir = 'D';
row++;
}
break;
}
return row * _size + col;
} 对于Matrix类来说,如果需要多种方式填充矩阵只需要修改findPosition()这个成员函数就可以了;
但是每次都需要改变Matrix这个类吗?只有findPosition()需要改变,其他的都不需要改变,可以使用虚函数的方式:
多态的威力:使用虚函数,将findPosition()函数的实现推迟到子类中
class Matrix
{
virtual int findPosition() = ;
}; class ClockwiseMatrix:public Matrix
{
int row,col;
char dir;
public:
int findPosition();
}; class RowFirstMatrix:public Matrix
{
int next;//initialize as 0
public:
int findPosition()
{
return next++;
}
}; int main()
{
//
matrix.fill();
} void matrix::fill()
{
for(int num = ;num <= N*N; num++)
{
int pos = findPosition();//findPosition();可以调用不同的形式
_data[pos] = num;
}
}
C++程序设计方法5:接口设计实例的更多相关文章
- 优秀的API接口设计原则及方法(转)
一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...
- STM32W108无线射频模块通用IO接口应用实例
STM32W108无线射频模块通用IO接口应用实例 本实例编写STM32W108的GPIO測试程序,通过控制GPIO引脚,实现对LED灯的控制. 开发环境与硬件说明 硬件:STM32W108无线开发板 ...
- 《程序设计方法》【PDF】下载
内容简介 <程序设计方法>主要以方法为主导,结合C语言,把程序设计方法学研究中若干成熟的理论和方法用通俗易懂的语言描述出来.<程序设计方法>还选取趣味性强.技巧性高.能够启发学 ...
- JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明
1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是r ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql
Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结 mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8 ...
- Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
随机推荐
- OpenCV-Python教程8-图像混合
一.图片相加 要叠加两张图片,使用cv2.add(),相加两幅图片的形状(高度.宽度.通道数)必须相同.numpy中可以直接用res = img1 + img2相加.但是两者的结果并不相同 impor ...
- XML使用与总结
xml是一种比较方便的数据储存方式,它适用于小数据的存储.最常见的适用地方莫过于各种web.config与app.config了. 一.创建一个简单的xml路径 public static str ...
- Git坑换行符自动转换 [转载]
转自https://www.cnblogs.com/zjoch/p/5400251.html 源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权 ...
- Multi-Fiber Networks for Video Recognition (MFNet)
Motivation:减少时空网络的计算量,保持视频分类精度的基础上,使速度尽可能接近对应网络的2D版本. 为此提出 Multi-Fiber 网络,将复杂网络拆分成轻量网络的集成,利用 fibers ...
- [转]java位运算(1)
http://blog.csdn.net/xiaochunyong/article/details/7748713 Java提供的位运算符有:左移( << ).右移( >> ) ...
- 伪分布式hadoop1.1.2和hbase0.94.11配置
Hadoop 1.1.2 和Hbase 0.94.11版本配置 测试时ip 172.19.32.128 这个版本需要把/etc/hosts的aa-vm改成127.0.0.1,也就是和localhos ...
- Centos 6.5 本地局域网基于HTTP搭建YUM
服务端配置 init 3 文本 init5 图形 init 0 关机 init 1 重启 ls 查看 mkdir创建文件 关闭防火墙service iptables stop chkconfig ...
- NOI2018Day2T1 屠龙勇士 set 扩展欧几里德 中国剩余定理
原文链接https://www.cnblogs.com/zhouzhendong/p/NOI2018Day2T1.html 题目传送门 - 洛谷P4774 题意 题解 首先我们仔细看一看样例可以发现如 ...
- web项目部署以及放到ROOT目录下
最近度过了一个国庆长假,好几天都没有写博客了! 发布这篇案例也是希望能帮助到像我一样的菜鸟o(* ̄︶ ̄*)o,百度上面的资料都不怎么全.也没有人说明注意事项.总是这篇说一点.那个人也说补一点,最后自己 ...
- python面试题之Python是如何进行内存管理的
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收. ...