C++ 对BFS tile类中的引用和指针感到困惑
我目前正在编写一个用于BFS算法的平铺类。我需要一个C++ 对BFS tile类中的引用和指针感到困惑,c++,pointers,reference,tile,breadth-first-search,C++,Pointers,Reference,Tile,Breadth First Search,我目前正在编写一个用于BFS算法的平铺类。我需要一个cameFrom变量,该变量将在我遍历网格时跟踪瓷砖的来源。它不应该在一开始就初始化,因为我们不知道它从哪里来。当我运行BFS算法时,它将不断更新 Error 1 error C2758: 'Tile::cameFrom' : a member of reference type must be initialized 有人知道怎么回事吗 这是我的Tile.hpp: #ifndef _TILE_H #define _TILE_H class
cameFrom
变量,该变量将在我遍历网格时跟踪瓷砖的来源。它不应该在一开始就初始化,因为我们不知道它从哪里来。当我运行BFS算法时,它将不断更新
Error 1 error C2758: 'Tile::cameFrom' : a member of reference type must be initialized
有人知道怎么回事吗
这是我的Tile.hpp:
#ifndef _TILE_H
#define _TILE_H
class Tile
{
public:
Tile(int x, int y);
~Tile();
int GetX();
int GetY();
bool IsWall();
bool IsVisited();
void SetCameFrom(Tile& cameFrom);
Tile& GetCameFrom();
void ToggleWall();
void ToggleVisited();
private:
int x;
int y;
bool isWall;
bool isVisited;
Tile& cameFrom;
};
#endif
My Tile.cpp:
#include "Tile.hpp"
Tile::Tile(int x, int y) {
this->x = x;
this->y = y;
this->isWall = false;
this->isVisited = false;
}
Tile::~Tile() {}
int Tile::GetX() {
return x;
}
int Tile::GetY() {
return y;
}
bool Tile::IsWall() {
return isWall;
}
bool Tile::IsVisited() {
return isVisited;
}
void Tile::SetCameFrom(Tile& cameFrom) {
this->cameFrom = cameFrom;
}
Tile& Tile::GetCameFrom() {
return cameFrom;
}
void Tile::ToggleWall() {
isWall = !isWall;
}
void Tile::ToggleVisited() {
isVisited = true;
}
它不应该在一开始就初始化,因为我们不知道它从哪里来
然后,您只能将指针用作必须初始化到某个对象的引用。当你在选择指针还是参考时,总是要问以下三个问题
- 我需要在声明时执行初始化的东西吗
- 我是否需要使其引用其生命周期中的其他变量(赋值)
- 我是否需要使该对象指向NULL
如果任何问题的答案为“是”,则选择指针“其他引用”。首先必须初始化引用,因此必须在构造函数中设置它。其次,您不能重新分配引用,因此您的
SetCameFrom
函数将无法工作。为此使用指针
Tile * cameFrom;
但在构造函数中初始化指向0(或C++11中的null ptr)的指针也很好
Tile::Tile(int p_x, int p_y):
x(p_x),
y(p_y),
cameFrom(0),
isWall(false),
isVisited(false)
{
}
必须初始化引用。在您的情况下,我会使用指针,因为指针可以为null;但这并不意味着你也应该把SetCameFrom的参数改成指针。哦,好吧,那么对于指针,这是否意味着在我的cpp文件中我需要更改一些东西?首先,在
SetCameFrom
中,我必须为指针'cameFrom'分配参数cameFrom
的地址,对吗?所以我会选择this->cameFrom=&cameFrom代码>。其次,在函数GetCameFrom()
中,我必须将函数输出重新定义为Tile*&Tile::GetCameFrom(){
因为cameFrom
现在是一个指针?或者我应该只返回指针而不是指针的引用吗?哦,好的,这意味着在我的cpp文件中我需要更改一些事情。首先,在SetCameFrom
中,我必须为指针cameFrom
分配参数cameFrom
的地址,对吗我将使用this->cameFrom=&cameFrom;
。其次,在函数GetCameFrom()
中,我必须将函数输出重新定义为Tile*&Tile::GetCameFrom(){
因为cameFrom
现在是一个指针?还是我应该返回指针而不是指针的引用?@1.从技术上讲,您可以使用&
获取cameFrom
参数的地址,但如果您修改一个函数以接受指针:void SetCameFrom,它会更干净(Tile*cameFrom);
.2.您应该只返回指针Tile*Tile::GetCameFrom()
。当您返回指针的引用时,调用者可以修改cameFrom
指向的对象(因为您返回指针的引用,并且引用的行为类似于引用变量的别名)。它实际上就像您将cameFrom
变量公开一样。