错误:未命名类型 我在C++中实现了一个象棋游戏,其中一些类是“棋盘”和“棋子”。 有“Rook”、“King”和,。。。等继承自“件”
所以一块板是一个二维的碎片数组,所以board.h包含了piece.h 对于最近的发展(关于实施行动),我想让这些作品进入董事会。 所以在片中。h我包括板。h 这现在会产生上述错误 一些代码:错误:未命名类型 我在C++中实现了一个象棋游戏,其中一些类是“棋盘”和“棋子”。 有“Rook”、“King”和,。。。等继承自“件”,c++,types,include,C++,Types,Include,所以一块板是一个二维的碎片数组,所以board.h包含了piece.h 对于最近的发展(关于实施行动),我想让这些作品进入董事会。 所以在片中。h我包括板。h 这现在会产生上述错误 一些代码: //Function in piece.h #include "board.h" bool Piece::move( int toX, int toY, bool enemyPawn, const Board & b ) 错误:电路板未命名类型 错误:ISO C++禁止声明“B”,没有类型[-f
//Function in piece.h
#include "board.h"
bool Piece::move( int toX, int toY, bool enemyPawn, const Board & b )
错误:电路板未命名类型
错误:ISO C++禁止声明“B”,没有类型[-fPrime]。
在
board.h
:放置类板代码>(带分号!)在包含工件.h之前
在片段中.h
:放置类片段代码>(带分号!)在include board.h之前
一般来说,如果我在标题中定义一个类,我会将class代码>位于文件顶部,位于任何包含项上方
你有所谓的循环依赖关系。这两个头都试图包含彼此,要么失败(如果您有包含保护),要么无限循环(没有保护)。无论哪种方式,这一“前瞻性声明”都应该解决问题
如果这些类是如此紧密地联系在一起以至于不能修复它们,那么您必须“解开”它们。将piece/bishop/king/etc的函数定义移动到各自的.cpp
文件(如果尚未移动),确保标题仅使用板和板*
(但不使用板
值),然后替换#包括“板”代码>带类板代码>。这会告诉编译器存在“未知”板类型,并且它可以通过指针和引用传递它。然后piece.h
将没有依赖项,并且可以正确地从任何文件中包括,如board.h
在板中.h
:放置类板代码>(带分号!)在包含工件.h之前
在片段中.h
:放置类片段代码>(带分号!)在include board.h之前
一般来说,如果我在标题中定义一个类,我会将class代码>位于文件顶部,位于任何包含项上方
你有所谓的循环依赖关系。这两个头都试图包含彼此,要么失败(如果您有包含保护),要么无限循环(没有保护)。无论哪种方式,这一“前瞻性声明”都应该解决问题
如果这些类是如此紧密地联系在一起以至于不能修复它们,那么您必须“解开”它们。将piece/bishop/king/etc的函数定义移动到各自的.cpp
文件(如果尚未移动),确保标题仅使用板和板*
(但不使用板
值),然后替换#包括“板”代码>带类板代码>。这会告诉编译器存在“未知”板类型,并且它可以通过指针和引用传递它。然后piece.h
将没有依赖项,并且可以正确地从任何文件中包括,如board.h
因为move只使用引用,所以您完全可以避免包含board.h,而只向前声明您的类board。如果您确实需要让piece了解board和board了解piece,您可以向board声明一个接口类(纯抽象)并包含该接口,而不是board,确保board从接口派生–Martin刚才编辑,因为move只使用引用,你完全可以避免加入board.h,只需向前声明你的类board。如果您真的需要让piece了解board和board了解piece,您可以向board声明一个接口类(纯抽象)并包含该接口,而不是board,确保board从接口派生–Martin刚才编辑了这是一个循环依赖项。我最近读到的一个提示是,想象一下如何在一个头文件中定义这两个类,这样每个类都知道另一个类;答案是,你不能
要打破循环依赖关系,需要对其中一个类使用前向声明,而不是包含其头文件。不要包含“board.h”
,只要做类board代码>这是一个循环依赖项。我最近读到的一个提示是,想象一下如何在一个头文件中定义这两个类,这样每个类都知道另一个类;答案是,你不能
要打破循环依赖关系,需要对其中一个类使用前向声明,而不是包含其头文件。不要包含“board.h”
,只要做类board
您可以使用pimpl模式:请参阅您可以使用pimpl模式:请参阅如何定义Board?Board.h中可能存在问题,因为Piece::move定义看起来很好。这些是Board的包含。h包括“bishop.h”
包括“king.h”
包括“knight.h”
“pawn.h”
包括“queen.h”
包括“rook.h”“
所以我从不直接包括棋子board包括bishop,bishop包括棋子,棋子包括棋子?你的棋盘是否包含空棋子?你如何定义棋盘?问题可能在board.h中,因为棋子::移动定义看起来很好。这些是board.h的包括。h包括“bishop.h”
包括“king.h”
包括“knight.h”
包括“pawn.h”
包括“queen.h”
包括“rook.h”
所以我从不直接包括棋子棋盘包括bishop,bishop包括棋子,棋子包括棋盘?你的棋盘是否包含空棋子?我确实使用了include guards,它只会抛出更多错误(尽管该解决方案符合逻辑)无效使用“struct-Piece”的不完整类型“struct-Piece”转发声明导致包含项上方的转发声明(classboard;
)无效
Error: Board does not name a type
Error: ISO C++ forbids declaration of ‘b’ with no type [-fpermissive]