错误:没有命名类型

ERROR: does not name a type

本文关键字:类型 错误      更新时间:2023-10-16

我正在用c++实现一个国际象棋游戏,其中一些类是"Board"answers"Piece"。有"车"、"国王"、……等继承自"Piece"

一个棋盘是一个二维的棋子数组所以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 )
<>之前错误:板没有命名类型错误:ISO c++禁止声明没有类型[-fpermissive]的' b '

因为move只使用了一个引用,所以你完全可以避免包含Board. h而只向前声明你的类Board。如果你真的需要棋子知道棋盘,棋盘也知道棋子,你可以为棋盘声明一个接口类(纯抽象),并包括那个接口,而不是棋盘,确保让棋盘从接口派生——Martin刚才编辑

board.h中:将class Board;(带分号!)放在include piece.h之前
piece.h中:将class Piece;(带分号!)放在include board.h之前。
一般来说,如果我在头文件中定义一个类,我会将class <classname>;放在文件的顶部,在任何include 之上。

你有一个所谓的循环依赖。两个标头都试图包含对方,要么失败(如果您有包含保护),要么无限循环(没有保护)。不管怎样,这个"前向声明"应该能解决问题。

如果这些类被捆绑在一起而不能修复它们,你将不得不"解开"它们。将piece/bishop/king/etc的函数定义移动到各自的.cpp文件(如果它们还没有),确保头文件只使用board&board*(但不使用board),然后用class board;替换#include "board";。这告诉编译器存在一个"未知"的板类型,它可以通过指针和引用传递它。然后piece.h将有没有依赖关系,并且可以像board.h一样正确地从任何文件中包含。

这是一个循环依赖。我最近读到的一个提示是,想象一下如何在一个头文件中定义这两个类,这样每个类都知道对方;答案是,你不能。

要打破循环依赖,你需要对其中一个类使用前向声明,而不是包括它的头文件。不做#include "board.h",只做class Board;

您可以使用pimpl模式:参见http://www.gotw.ca/gotw/024.htm