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

时间:2014-01-16 12:25:37

标签: c++ project-structure

我正在尝试下棋。我制作了两个头文件及其cpp文件:Pieces.h和ChessBoard.h。我在ChessBoard.h中包含了Pieces.h并且编译得很好。但是我希望在Pieces中有一个需要ChessBoard作为参数的方法。因此,当我尝试在Pieces.h中包含ChessBoard.h时,我得到了所有奇怪的错误。有人可以指导我如何在Pieces.h中包含ChessBoard.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

2 个答案:

答案 0 :(得分:1)

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

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

前向声明表示在使用之前声明该类。

class ChessBoard;

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

答案 1 :(得分:0)

它被称为冗余包含。 当你在两个类中包含一个H(Pieces和Chessboards)时,C ++通常会产生奇怪的错误。当你用C ++开始编程时,这是一个非常常见的错误。

首先,我建议你检查一下你是否真的需要将每个课程都包含在另一个课程中。如果你真的很确定,那么修复它的方法是选择其中一个并将include移动到cpp。 然后在h。

中添加该类的预先声明

例如,如果您选择更改ChessBoard:

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

class Pieces;

class ChessBoard
  {

在ChessBoard cpp中,您将拥有#include“Pieces.h”

Pieces h和cpp保持不变。