我记我们在提到方块走动的位置的时候,说过它有三种走法。但是那个时候是因为它的右边是墙壁。但是如果我们把它放在空位上,那么是不是它就有了4种走法?也就是 东南西北。这个时候我们就有必要为方块的走法来制定一个接口,实现这一行为。下面的代码不提供分析,具体的代码分析参考: C++抽象编程——接口(2)——接口的用途
Direction.h
/*这个文件处理一些关于方位上的应用*/
#ifndef _direction_h
#define _direction_h
#include <string>
/*声明枚举类型*/
enum Direction { NORTH, EAST, SOUTH, WEST };
/*
*函数: leftFrom
*用法: Direction dir2 = leftFrom(Direction dir)
*-------------------------------
*在你原本的方位上向左转
*/
Direction leftFrom(Direction dir);//返回类型是Direction
/*
*函数: rightFrom
*用法: Direction dir2 = rightFrom(Direction dir)
*-------------------------------
*在你原本的方位上向右转
*/
Direction rightFrom(Direction dir);
/*
*函数: directionToString
*用法: string str = directionToString(Direction dir)
*-------------------------------
*将枚举类型转变为string类型,以便输出
*/
std::string directionToString(Direction dir);
#include "Directionpriv.h"
#endif
Directionpriv.h
/*
*这部分内容为不希望用户看到的内容,虽然这个枚举类型不是类。也就意味着
*没有私有成员,但是我们接口的目的就是为了隐藏程序的复杂性。只要是你觉
*得不希望用户看到并且篡改,你都可以写一个文件用于隐藏,虽然不存在访问
*的限制。C++中也是允许我们为枚举类型定义一些操作的
*/
/*重载插入运算符,以便其能方便输出*/
std::ostream & operator<<(std::ostream &os, Direction dir);
/*重载++运算符(前)*/
Direction operator++(Direction &dir);
/*重载++运算符(后)*/
Direction operator++(Direction &dir, int);//注意重载后缀运算符的时候,后面加int
Direction.cpp
#include <iostream>
#include "Direction.h"
using namespace std;
/*实现左转*/
Direction leftFrom(Direction dir){
return Direction((dir + 3) % 4);//返回该类型的值
}
/*实现右转*/
Direction rightFrom(Direction dir) {
return Direction((dir + 1) % 4);
}
/*转变为string类输出*/
string directionToString(Direction dir) {
switch(dir){
case NORTH:
return "NORTH";
case EAST:
return "EAST";
case SOUTH:
return "SOUTH";
case WEST:
return "WEST";
default:
return "???";
}
}
/* << 运算符的重载 */
ostream & operator<<(ostream &os, Direction dir){
return os << directionToString(dir);
}
/*++dir 重载*/
Direction operator++(Direction &dir){
return Direction(dir + 1);
}
/* dir++ 重载*/
Direction operator++(Direction &dir, int){
Direction old = dir;
dir = Direction(dir + 1);
return old;
}
这里注意前缀跟后缀的区别。
测试代码
#include <iostream>
#include "Direction.h"
using namespace std;
int main(){
for (Direction dir = NORTH; dir <= WEST; dir++){
cout << dir << endl;
}
return 0;
}
测试结果: