对我的 BFS 磁贴中的引用和指针感到困惑 class
Confused about references and pointers in my BFS tile class
我目前正在编写要在我的 BFS 算法中使用的 Tile 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
我的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;
}
不应该一开始就初始化,因为我们不知道一开始它是从哪里来的
那你就只能用指针了,因为引用必须被初始化为某物。当您在 pointer 或 reference.
之间进行选择时,请始终问以下三个问题
我需要在声明时执行初始化的东西吗?
我需要让它在它的生命周期中引用其他变量(赋值)吗?
我是否需要使该对象指向 NULL。
如果对任何一个问题的回答是肯定的,那么选择其他指针参考。
首先必须初始化引用,所以你必须在构造函数中设置它。其次,您不能重新分配参考,因此您的 SetCameFrom
函数将不起作用。为此使用指针。
Tile * cameFrom;
但在构造函数中将指针初始化为 0(或 C++11 中的 nullptr)也很好。
Tile::Tile(int p_x, int p_y):
x(p_x),
y(p_y),
cameFrom(0),
isWall(false),
isVisited(false)
{
}
我目前正在编写要在我的 BFS 算法中使用的 Tile 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
我的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;
}
不应该一开始就初始化,因为我们不知道一开始它是从哪里来的
那你就只能用指针了,因为引用必须被初始化为某物。当您在 pointer 或 reference.
之间进行选择时,请始终问以下三个问题我需要在声明时执行初始化的东西吗?
我需要让它在它的生命周期中引用其他变量(赋值)吗?
我是否需要使该对象指向 NULL。
如果对任何一个问题的回答是肯定的,那么选择其他指针参考。
首先必须初始化引用,所以你必须在构造函数中设置它。其次,您不能重新分配参考,因此您的 SetCameFrom
函数将不起作用。为此使用指针。
Tile * cameFrom;
但在构造函数中将指针初始化为 0(或 C++11 中的 nullptr)也很好。
Tile::Tile(int p_x, int p_y):
x(p_x),
y(p_y),
cameFrom(0),
isWall(false),
isVisited(false)
{
}