ОШИБКА: не называет тип - PullRequest
0 голосов
/ 18 октября 2011

Я реализую игру в шахматы на С ++, и некоторые классы - «Доска» и «Кусок». Существуют классы "Ладья", "Король" и т. Д., Унаследованные от "Куска".

Таким образом, доска - это двумерный массив фигур, поэтому в board.h включен файл piece.h.

Для недавней разработки (по реализации ходов) я хотел дать частям доступ к доске. так что в piece.h я включил board.h.

Теперь это создает вышеуказанную ошибку.

Некоторые коды:

//Function in piece.h
#include "board.h"
bool Piece::move( int toX, int toY, bool enemyPawn, const Board & b )
Error: Board does not name a type
Error: ISO C++ forbids declaration of ‘b’ with no type [-fpermissive]

Ответы [ 4 ]

1 голос
/ 18 октября 2011

Поскольку для перемещения используется только ссылка, вы можете определенно избежать включения board.h и только объявить досрочно свой класс Board.Если вам действительно нужно, чтобы элемент знал о плате, а плата знала о элементе, вы могли бы объявить класс интерфейса для Board (чистый абстрактный) и включить этот интерфейс вместо платы, чтобы убедиться, что плата получена из интерфейса - Мартин только сейчас редактирует

1 голос
/ 18 октября 2011

Это круговая зависимость.Один совет, который я недавно прочитал, состоит в том, чтобы представить, как бы вы определили оба класса в одном заголовочном файле, чтобы каждый знал о другом;Ответ: вы не можете.

Чтобы разорвать циклическую зависимость, вам нужно использовать предварительное объявление для одного из классов, а не включать его заголовочный файл.Вместо #include "board.h", просто сделайте class Board;.

1 голос
/ 18 октября 2011

В board.h: поставить class Board; (с точкой с запятой!) Перед include piece.h.
В piece.h: поставьте class Piece; (с точкой с запятой!) Перед include board.h.
В общем, если я определяю класс в заголовке, я помещаю class <classname>; вверху файла, над любым включает .

У вас есть то, что называется круговой зависимостью. Оба заголовка пытаются включить друг друга, и либо терпят неудачу (если у вас есть охранники), либо бесконечный цикл (без охранников). В любом случае, эта «предварительная декларация» должна решить проблему.

Если классы настолько связаны между собой, что это не исправляет их, вам придется их "развязать". Переместите определения функций для piece / bishop / king / etc в соответствующие им файлы .cpp (если они еще не были), убедитесь, что заголовки используют только board& и board* (но не board по значению). ), а затем замените #include "board"; на class board;. Это сообщает компилятору, что существует «неизвестный» тип платы, и он может передавать его по указателю и по ссылке. Тогда piece.h будет иметь нет зависимостей и может быть корректно включен из любого файла, например board.h.

0 голосов
/ 18 октября 2011

Вы можете использовать шаблон pimpl: см. http://www.gotw.ca/gotw/024.htm

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