C++ 对BFS tile类中的引用和指针感到困惑

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

我目前正在编写一个用于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 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
变量公开一样。