Запутался в ссылках и указателях в моем классе плиток BFS

В настоящее время я кодирую класс Tile для использования в моем алгоритме 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

Мой 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;

}

1

Решение

Сначала ссылка должна быть инициализирована, так что вам нужно будет установить ее в конструкторе. Во-вторых, вы не можете переназначить ссылку, поэтому ваш SetCameFrom функция не будет работать Используйте указатели для этого.

Tile * cameFrom;

Но также хорошо инициализировать указатель на 0 (или nullptr в C ++ 11) в конструкторе.

Tile::Tile(int p_x, int p_y):
x(p_x),
y(p_y),
cameFrom(0),
isWall(false),
isVisited(false)
{
}
2

Другие решения

Его не следует инициализировать в начале, так как мы не знаем, откуда он появился в начале

Тогда вы можете использовать только указатели, так как ссылки должны быть инициализированы. Всегда задавайте следующие три вопроса, когда вы застряли над выбором между указатель ИЛИ ЖЕ ссылка.

  • Нужно ли мне что-то, для чего мне нужно выполнить инициализацию в момент ее объявления.

  • Нужно ли сделать это, чтобы ссылаться на какую-то другую переменную (назначить) в ее жизни.

  • Мне нужно, чтобы этот объект указывал на NULL.

Если ответом на любой вопрос является «Да», тогда выберите указатель или ссылку.

1

По вопросам рекламы [email protected]