C ++ Beginner - Проблемы с использованием структур и констант! - PullRequest
1 голос
/ 11 мая 2010

В настоящее время я работаю над простой реализацией Scrabble для проекта колледжа.

Я не могу заставить его работать, хотя!

Проверьте это:

My board.h:

http://pastebin.com/J9t8VvvB

Подпрограмма, в которой лежит ошибка:

//Following snippet contained in board.cpp
//I believe the function is self-explanatory...
//Pos is a struct containing a char, y, a int, x and an orientation, o, which is not   //used in this particular case
void Board::showBoard()
{
    Pos temp;
    temp.o = 0;

    for (temp.y = 'A'; temp.y < (65 + TOTAL_COLUMNS); ++temp.y)
    {
        for (temp.x = 1; temp-x < (1 + TOTAL_ROWS); ++temp.x)
        {
            cout << _matrix[temp].getContents();
        }
        cout << endl;
    }
}

Ошибки, возвращаемые во время компиляции:

http://pastebin.com/bZv7fggq

Почему ошибка говорит о том, что я пытаюсь сравнить два Pos, когда я сравниваю char s и int s?

Я тоже действительно не могу разместить эти другие ошибки ...

Спасибо за ваше время!

EDIT:

Поскольку весь мой проект зависит от Pos, я попытаюсь перегрузить для него оператор <... Кто-нибудь может дать мне несколько советов по этому поводу? Имейте в виду, я новичок! </p>

1 Ответ

9 голосов
/ 11 мая 2010
#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> >. (Обратите внимание на пробел между > >! Без него это будет проанализировано как оператор смещения вправо >>!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...