-
深拷贝好复杂
查看全部 -
对象数组的用法
查看全部 -
this指针的用法
查看全部 -
A对象在B对象中,A需要参数进行构造
则必须使用初始化列表的方式对A进行实例化
查看全部 -
成员变量命名建议加前缀m。
A对象在B对象中
实例化对象时,先实例化A对象,再实例化B对象,销毁时相反
用初始化列表实例化A对象
查看全部 -
查看全部
-
p指向第一个对象。
执行p++后则p指向第二个对象,此时p[0]表示的也是第二个对象,
只有当p指向原来的位置时,才可以使用delete []p,否则会报错
查看全部 -
在c++ 中只要一个文件里面包含了的头文件,在另一个文件里引用了,就不需要重复的再去写头文件和命名空间
查看全部 -
Coordinate * const p 和 Coordinate const *p 是不一样的。Coordinate * const p 中的const 修饰指针,代表指针指向的地址是一个常量,地址不能改。Coordinate const *p 中的const 修饰指针变量,代表指针指向的变量是个常量,变量不能改。
查看全部 -
指针的拷贝要new一个新的指针,然后把要复制的值复制到新的指针中。
查看全部 -
Const成员要在构造函数的初始化列表中初始化
查看全部 -
码上大佬的代码,致敬!
#include <iostream>
#include <Windows.h>
#include <string>
#include <process.h>
#include <Windows.h>
using namespace std;
/* https://zhidao.baidu.com/question/1755742141667975828.html
设定初始面向 East ( 如果是右手抹墙则是 West)
1如果当前格为第一排,则说明当前格为终点,结束。
2根据当前格的数据,找到下一步需要面向的方向, 方法是,如果当前方向上有墙,则顺时针(右手抹墙则逆时针)转身,重复这一步骤直到面向的方向上可以行走
3沿当前方向走一步
4逆时针(右手抹墙则顺时针)转身一次,使当前面对方向为第3步之后的左手(或右手)方向, 然后回到步骤1
*/
//墙体和路常量
#define WOLD "■"
#define ROLD " "
//迷宫大小常量
const int X = 8;
const int Y = 8;
//计步器
int count = 0;
//方向枚举
enum direction{
N = 0,
S = 1,
W = 2,
E = 3
};
//地图类
class MazeMap {
public:
MazeMap() {}
void coutMap(string map[X][Y]) { //构造地图
for (int i = 0; i < X; i++) {
for (int j = 0; j < Y; j++) {
cout << map[i][j] ;
}
cout << endl;
}
}
};
//人类类
class Human {
public:
Human() :x(6), y(6), man("☆"), direction(W){} //默认人初始化为第一个位置
Human(string _man) :x(6), y(6), man(_man), direction(W){} //可以设置人的标识符
//横纵坐标
int x;
int y;
//人物标识
string man;
//方向
int direction;
// 移动方法
void humanMove(string map[X][Y], Human *man) {
MazeMap *mazeMap = new MazeMap;
map[man->x][man->y] = man->man;
mazeMap->coutMap(map);
cout << "READY?(Q:y/n)" << endl;
char flag = 'n';
cin >> flag;
//单向寻路原则 右手抹墙,初始朝向为W
if (flag == 'y') {
do
{
turnBack(map, man);
move(map, man);
Sleep(1000);
system("cls");
mazeMap->coutMap(map);
} while (finsh(man));
cout << "YOU WIN!!!" << endl;
}
else {
cout << "YOU ARE A LOSE!!!" << endl;
}
delete mazeMap;
mazeMap = NULL;
}
//确定方向 如果方向上有墙就逆时针转一下
void turnBack(string map[X][Y],Human *man) {
static int cache = 0;
if (man->direction == N) {
if (map[man->x - 1][man->y] == WOLD) {
man->direction = W;
cache++;
turnBack(map, man);
}
cache = 0;
return;
}
if (man->direction == S) {
if (map[man->x+1][man->y] == WOLD) {
man->direction = E;
cache++;
turnBack(map, man);
}
cache = 0;
return;
}
if (man->direction == W) {
if (map[man->x][man->y-1] == WOLD) {
man->direction = S;
cache++;
turnBack(map, man);
}
cache = 0;
return;
}
if (man->direction == E) {
if (map[man->x][man->y+1] == WOLD) {
man->direction = N;
cache++;
turnBack(map, man);
}
cache = 0;
return;
}
if (cache == 4) {
cache = 0;
return;
}
}
//移动一格 后顺时针调转方向
void move(string map[X][Y], Human *man) {
if (man->direction == N) {
man->direction = E;
map[man->x - 1][man->y] = man->man;
map[man->x][man->y] = ROLD;
man->x -= 1;
}else if (man->direction == S) {
man->direction = W;
map[man->x + 1][man->y] = man->man;
map[man->x][man->y] = ROLD;
man->x += 1;
}else if (man->direction == W) {
man->direction = N;
map[man->x][man->y - 1] = man->man;
map[man->x][man->y] = ROLD;
man->y -= 1;
}else if(man->direction == E) {
man->direction = S;
map[man->x][man->y + 1] = man->man;
map[man->x][man->y] = ROLD;
man->y += 1;
}
return;
}
//判断是否完成
bool finsh(Human *man) {
if (man->x == 0)
return false;
return true;
}
};
int main(void) {
string map[X][Y] = { {WOLD,ROLD,WOLD,WOLD,WOLD,WOLD,WOLD,WOLD},
{WOLD,ROLD,ROLD,ROLD,ROLD,ROLD,WOLD,WOLD},
{WOLD,WOLD,WOLD,WOLD,WOLD,ROLD,ROLD,WOLD},
{WOLD,ROLD,ROLD,ROLD,ROLD,ROLD,WOLD,WOLD},
{WOLD,WOLD,ROLD,WOLD,ROLD,ROLD,WOLD,WOLD},
{WOLD,WOLD,ROLD,ROLD,ROLD,WOLD,WOLD,WOLD},
{WOLD,WOLD,WOLD,WOLD,ROLD,ROLD,ROLD,WOLD},
{WOLD,WOLD,WOLD,WOLD,WOLD,WOLD,WOLD,WOLD} };
Human *man = new Human("⊙");
man->humanMove(map,man);
delete man;
man = NULL;
return 0;
}
查看全部 -
/*
常对象成员,常函数,常对象
要求:
定义两个类:
Coordinate:数据成员:m_iX,m_iY
成员函数:构造函数,析构函数,封装函数
Line:数据成员:点A,点B
成员函数:构造函数,析构函数,封装函数,信息打印函数
*/
常对象只能调用常成员函数。
普通对象既可以调用普通成员函数,也可以调用常成员函数。
常成员函数不能改变成员的值(因为不传入this指针)
const 对象不能修改其成员变量,也就是说只能读不能写
为什么需要const成员函数? 我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。例如,定义一个整型常量的方法为: const int i=1 ; 同样,也可以定义常量对象,假定有一个类classA,定义该类的常量对象的方法为: const classA a(2); 这里,a是类classA的一个const对象,"2"传给它的构造函数参数。const对象的数据成员在对象生存期内不能改变。但是,如何保证该类的数据成员不被改变呢? 为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。
查看全部 -
常成员函数:
声明:<类型标志符>函数名(参数表)const;
如果一个成员函数对类中数据成员只作访问而不作直接或间接的修改,则最好将此函数设置为常成员函数,以明确表示它对数据成员的保护性。
必须是常对象才能调用常成员函数。
常成员函数与普通成员函数互为重载,常成员函数只能由常对象调用,普通成员函数由普通对象调用。
查看全部 -
this指针就是当前对象的地址,可以直接输出cout<<this *this表示当前实例对象 如果返回值为类 类型对象,那么其实是个临时对象,并不是原来对象,如 Array getA() { return *this; } 此时得到的并不是原来的*this对象。 要获得原对象实例可以改为Array&引用类型或Array*指针类型。
查看全部
举报