Прежде всего, вы не должны использовать референтные члены для этой цели. Они предназначены для случаев, когда имя должно ссылаться на объект, который уже существует.
Класс может выглядеть следующим образом:
class Tree {
public:
Tree(int boardHeight, int boardWidth, Point knightStart, Point knightEnd);
private:
Board board;
Node root;
Point end;
};
/* IMPLEMENTATION FILE */
Tree::Tree(int boardHeight, int boardWidth, Point knightStart, Point knightEnd)
: Board(boardHeight, boardWidth), root(knightStart, knightEnd), end(knightEnd) {}
, который вы видите намного проще, чем тот, который у вас есть в настоящее время. Фактически, было бы обычной практикой иметь встроенное тело заголовка в заголовке, так как он только инициализирует элементы и не делает ничего сложного.
Когда я пытаюсь назначить корень, я получаю функцию "Узел":: operator = (const Node &) "(объявлен неявно) не может быть указан - это ошибка удаленной функции.
Это сообщение, вероятно, указывает на то, что вы сделали аналогичную вещь в Node
class, т.е. использует ссылочные переменные в качестве членов, что отключает неявное присваивание ( см. здесь для причины). Вам также следует изменить дизайн других классов, чтобы в этом случае ссылки не использовались.
Более того, вы должны получать другие сообщения об ошибках до того, которое вы цитировали. В частности, что вы не инициализировали ссылочные элементы. Вообще говоря, если у вас есть несколько ошибок, вы должны сосредоточиться сначала на исправлении первой ошибки, так как часто другие ошибки являются следствием первой и исчезают, когда первая исчезнет.
Если бы этот код был Java, он бы работал.
C ++ отличается от Java, и вам лучше привыкнуть к этому факту. Если вы используете элемент типа std::shared_ptr<Board>
вместо Board
, тогда он будет иметь семантику , аналогичную (но не идентичную) ссылкам на Java. Однако это будет считаться плохим стилем в C ++, если вы специально не собираетесь использовать один объект платы для нескольких деревьев.
В C ++ ссылочная переменная не выполняет управление временем жизни объекта, к которому вы привязаны;и, кроме того, оно должно быть связано с инициализацией, и переподключение невозможно. Надеюсь, ясно, что это не подходит для того, как вы его используете. Он имеет другое назначение и поведение по сравнению с Java-ссылкой, несмотря на то же имя.