繁体   English   中英

错误:未命名类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM