[英]ERROR: does not name a type
我正在用C ++实现国际象棋游戏,其中一些类是“ Board”和“ Piece”。 从“ Piece”继承的类有“ Rook”,“ King”等。
因此,一块木板是一块2D阵列,因此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]
在board.h
:放置class Board;
(带有分号!)之前要include piece.h
。
在piece.h
:放置class Piece;
(带有分号!),然后include board.h
。
通常,如果我在标题中定义一个类,则将class <classname>;
放进去class <classname>;
在文件顶部, 在任何上方包括 。
您具有所谓的循环依赖关系。 这两个标头都试图互相包含,并且要么失败(如果您有包含保护),要么无限循环(没有保护)。 无论哪种方式,这种“前向声明”都可以解决问题。
如果这些类之间的联系是如此紧密,以至于无法解决问题,则您必须“取消”它们。 移动计件/主教/王/等功能的定义各自.cpp
文件(如果他们没有的话),请确保头只用board&
和board*
(而不是board
的值),然后更换#include "board";
带class board;
。 这告诉编译器存在“未知”板类型,并且可以通过指针和引用传递它。 然后piece.h
将没有依赖项,并且可以正确地从任何文件中包含,例如board.h
。
由于move仅使用参考,因此您可以肯定地避免包含board.h,而仅向前声明您的Class Board。 如果您真的需要对电路板有一定的了解,而对电路板也有一定的了解,则可以向Board声明一个接口类(纯抽象),并包含该接口而不是Board,以确保将Board派生自该接口– Martin现在编辑
这是一个循环依赖性。 我最近读到的一个提示是,想象一下如何在一个头文件中定义两个类,以便彼此了解。 答案是,你不能。
要打破循环依赖关系,您需要对其中一个类使用前向声明,而不要包括其头文件。 而不是#include "board.h"
,而是执行class Board;
。
您可以使用pimpl模式:请参阅http://www.gotw.ca/gotw/024.htm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.