Ошибка c ++: ожидаемый неквалифицированный идентификатор перед маркером '[' - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь сделать простую игру на с ++, я почти закончил, но продолжаю сталкиваться с этой ошибкой. Я уверен, что это синтаксические ошибки, я просто не уверен, как их исправить.

Board::Board()
{
    side = 6;
    Piece[][] spaces = new Piece[6][6];
    for (int row = 00; row < side; ++row)
    {
        for (int column = 0; column < side; ++column)
        {
            spaces[row][column] = new blankPiece;
        }
    }
}

Вот что говорит Eclipse:

..\Board.cpp: In constructor 'Board::Board()':
..\Board.cpp:13:7: error: expected unqualified-id before '[' token
..\Board.cpp:18:30: error: no match for 'operator=' in '((Board*)this)->Board::spaces[row][column] = (operator new(8u), (<statement>, ((blankPiece*)<anonymous>)))'
..\/Piece.h:14:1: note: candidate is: Piece& Piece::operator=(const Piece&)

Ответы [ 5 ]

4 голосов
/ 07 апреля 2011

Это незаконно:

Piece[][]

C ++ не хранит двумерный массив в виде массива указателей, а представляет собой плоскую последовательность подмассивов. Поэтому должны быть указаны все, кроме последней границы.

Кроме того, new не является необходимым и нежелательным, если размер массива фиксирован. Просто используйте это.

Piece spaces[6][6]; // that's all!

Наконец, записи в массиве являются Piece объектами, а не указателями. Инициализация их blankPiece (что бы это ни было) должна быть ненужной, поскольку конструктор по умолчанию (без аргументов) Piece::Piece() должен инициализировать объект в пустое состояние. Для повторной инициализации используйте

myPiece = Piece();

Если размер массива является переменным, рекомендуется использовать std::vector вместо new[]. Вот наиболее распространенный подход к двумерному vector:

typedef vector< vector< Piece > > Board;
Board spaces( 6, vector< Piece >( 6 ) );

Это немного уродливо, и вы можете посмотреть на альтернативы, такие как boost::multi_array.

1 голос
/ 07 апреля 2011

Используйте только это

Количество мест [6] [6];

1 голос
/ 07 апреля 2011

Я не думаю, что вы можете сделать Piece[][], попробуйте:

Piece** spaces = new Piece*[6];
for(int i = 0; i < 6; i++) {
    spaces[i] = new Piece[6];
}

Или используйте boost::multi_array.

1 голос
/ 07 апреля 2011

Вот эта строка: Piece[][] spaces = new Piece[6][6];

Это не так, как C ++ создает имена типов для массивов.Попробуйте:

Piece (*spaces)[6] = new Piece[6][6];
0 голосов
/ 07 апреля 2011

Вы не можете объявить массив с более чем 1 неизвестным измерением.Вместо этого используйте указатели или std::vector.

Кроме того, вы выделяете память, которую храните в локальной переменной spaces, которая исчезает после выхода из функции, она должна быть членом класса.

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