gpt4 book ai didi

c++ - 当我尝试在 C++ 中包含头文件时,为什么会出现错误?

转载 作者:行者123 更新时间:2023-11-28 07:10:00 24 4
gpt4 key购买 nike

我正在尝试制作国际象棋游戏。我制作了两个头文件及其 cpp 文件:Pieces.h 和 ChessBoard.h。我已将 Pieces.h 包含在 ChessBoard.h 中,并且编译正常。但是我想在需要 ChessBoard 作为参数的 Pieces 中有一个方法。因此,当我尝试将 ChessBoard.h 包含在 Pieces.h 中时,我得到了所有奇怪的错误。有人可以指导我如何将 ChessBoard.h 包含在 Pieces.h 中吗?

Pieces.h:

#ifndef PIECES_H
#define PIECES_H
#include <string>
#include "ChessBoard.h"
using namespace std;

class Pieces{

protected:
bool IsWhite;
string name;
public:
Pieces();
~Pieces();

// needs to be overwritten by every sub-class
virtual bool isValidMove(string initial,string final, ChessBoard& chessBoard) = 0;
bool isWhite();
void setIsWhite(bool IsWhite);
string getName();
};

#endif

棋盘.h :

#ifndef CHESSBOARD_H
#define CHESSBOARD_H

#include "Pieces.h"
#include <map>
#include <string.h>

class ChessBoard
{
// board is a pointer to a 2 dimensional array representing board.
// board[rank][file]
// file : 0 b 7 (a b h)
std::map<std::string,Pieces*> board;
std::map<std::string,Pieces*>::iterator boardIterator;

public:
ChessBoard();
~ChessBoard();
void resetBoard();
void submitMove(const char* fromSquare, const char* toSquare);
Pieces *getPiece(string fromSquare);
void checkValidColor(Pieces* tempPiece); // to check if the right player is making the move

};
#endif

错误:

ChessBoard.h:26: error: ‘Pieces’ was not declared in this scope
ChessBoard.h:26: error: template argument 2 is invalid
ChessBoard.h:26: error: template argument 4 is invalid
ChessBoard.h:27: error: expected ‘;’ before ‘boardIterator’
ChessBoard.h:54: error: ISO C++ forbids declaration of ‘Pieces’ with no type
ChessBoard.h:54: error: expected ‘;’ before ‘*’ token
ChessBoard.h:55: error: ‘Pieces’ has not been declared

最佳答案

这是由于称为循环依赖的原因造成的。 circular dependency

问题是当你的程序开始编译时(假设 chessboard.h 首先开始编译)。
它看到包含 pieces.h 的指令,因此它跳过其余代码并移动到 pieces.h
在这里,编译器看到包含 chessboard.h 的指令
但是因为你包括了一个头球后卫,所以它第二次不包括 chessboard.h 。
它继续编译 pieces.h 中的其余代码
这意味着 chessboard.h 中的类尚未声明,它会导致错误
避免这种情况的最好办法是转发声明其他类而不是包含头文件。但是您必须注意,您不能创建前向声明类的任何对象,您只能创建指针或引用变量。

前向声明意味着在使用类之前先声明它。

class ChessBoard;

class Pieces
{
ChessBoard *obj; // pointer object
ChessBoard &chessBoard;

关于c++ - 当我尝试在 C++ 中包含头文件时,为什么会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21161722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com