C++抽象编程——回溯算法(2)——准备Direction文件

来源:互联网 发布:网络监控系统结构图 编辑:程序博客网 时间:2024/06/18 00:49

我记我们在提到方块走动的位置的时候,说过它有三种走法。但是那个时候是因为它的右边是墙壁。但是如果我们把它放在空位上,那么是不是它就有了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;} 

测试结果:

0 0
原创粉丝点击