我正在尝试下棋游戏。我制作了两个头文件及其cpp文件:Pieces.h和ChessBoard.h。我在ChessBoard.h中包含了Pieces.h,并且编译良好。但是我想在Pieces中有一个需要ChessBoard作为参数的方法。因此,当我尝试将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


ChessBoard.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;

10-08 01:16