В настоящее время я кодирую класс 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;
}
Сначала ссылка должна быть инициализирована, так что вам нужно будет установить ее в конструкторе. Во-вторых, вы не можете переназначить ссылку, поэтому ваш 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)
{
}
Его не следует инициализировать в начале, так как мы не знаем, откуда он появился в начале
Тогда вы можете использовать только указатели, так как ссылки должны быть инициализированы. Всегда задавайте следующие три вопроса, когда вы застряли над выбором между указатель ИЛИ ЖЕ ссылка.
Нужно ли мне что-то, для чего мне нужно выполнить инициализацию в момент ее объявления.
Нужно ли сделать это, чтобы ссылаться на какую-то другую переменную (назначить) в ее жизни.
Мне нужно, чтобы этот объект указывал на NULL.
Если ответом на любой вопрос является «Да», тогда выберите указатель или ссылку.