#define TOTAL_ROWS 15;
#define TOTAL_COLUMNS 15;
Тезисы являются определениями препроцессора, которые не должны заканчиваться точкой с запятой. Точка с запятой станет частью текста замещения, поэтому компилятор видит что-то вроде (65 + 15;)
, что явно неправильно.
В C ++ лучше использовать const
переменные вместо #define
с. В этом случае вы можете указать в вашем Board.cpp
следующее:
const unsigned int TOTAL_ROWS = 15;
const unsigned int TOTAL_COLUMNS = 15;
Затем вы можете сделать их доступными через заголовок, поместив их в Board.h
:
extern const unsigned int TOTAL_ROWS;
extern const unsigned int TOTAL_COLUMNS;
Еще чище - объявить их учениками. Поместите их в Board.cpp
:
const unsigned int Board::TOTAL_ROWS = 15;
const unsigned int Board::TOTAL_COLUMNS = 15;
И в Board.hpp
, внутри в разделе public
определения class
:
static const unsigned int TOTAL_ROWS;
static const unsigned int TOTAL_COLUMNS;
Они должны быть static
, потому что они не принадлежат какому-либо конкретному Board
экземпляру, а скорее являются свойствами класса в целом. Вы можете получить к ним доступ вне класса Board
, написав Board::TOTAL_ROWS
и т. Д.
Другая проблема заключается в том, что вы создаете map<Pos, Cell>
. Шаблон map
требует, чтобы для его типа ключа (Pos
) был задан действительный оператор <
; внутренне map
сортирует свои элементы с помощью этого оператора, поэтому он может выполнять быстрый поиск. Ошибка возникает только в том месте, где вы пытаетесь найти что-то на карте; это связано с тем, как работают шаблоны, поэтому не ломайте голову над этим прямо сейчас.
Одним из решений является перегрузка этого оператора самостоятельно, чтобы определить порядок для Pos
объектов. Я бы не рекомендовал это новичку, потому что
- перегрузка оператора - продвинутая техника, а
- Вы должны быть очень осторожны, чтобы определить непротиворечивое поведение, иначе
map
неправильное поведение звезд и
- если вы сделаете это, вам также следует перегрузить
>
, <=
и >=
, ==
и !=
.
Как говорится, вот код. Это предполагает, что два Pos
объекта с одинаковыми значениями x
и y
считаются равными; он не смотрит на значение o
(что странно иметь в «координатном» типе, и я не знаю, для чего оно используется).
bool operator<(Pos const &l, Pos const &r) {
if (l.y < r.y) return true;
if (l.y > r.y) return false;
if (l.x < r.x) return true;
if (l.x > r.x) return false;
return false;
}
Другой (лучший) вариант - полностью отказаться от типа Pos
и представить свою доску в виде двумерного массива или vector
из vector
с. Его тип будет тогда vector<vector<Cell> >
. (Обратите внимание на пробел между > >
! Без него это будет проанализировано как оператор смещения вправо >>
!)