当我将两个头文件链接在一起时,一个不能识别另一个

时间:2015-07-23 20:45:42

标签: c++

我正在使用涉及多个课程的C ++制作棋盘游戏。当我在piece.h中加入board.h的标题文件时,所有作品的成员都被董事会识别。但是,当我同时将board.hpiece.h关联起来时,董事会成员就无法被识别。 以下是我如何链接它们:

-In piece.h

    #ifndef PIECE_H_
    #define PIECE_H_
    #include <iostream>
    #include "board.h"

-In board.h

    #ifndef BOARD_H_
    #define BOARD_H_
    #include<iostream>
    #include "piece.h"

我宣布了板件功能的板件和件类型参数的多件成员,并且它们工作正常。然而,在片段中声明了一个带有板参数的void函数,如下:

    void horizontal         (Board b);
    void vertical           (Board b);
    void diagonal           (Board b);

导致错误说&#34;董事会尚未宣布&#34;

3 个答案:

答案 0 :(得分:4)

包含一个文件基本上告诉预处理器&#34;在这里复制该文件的内容&#34;。如果两个标题彼此引用,则您有一个循环引用,无法编译。编译器必须至少知道所使用的数据类型 这可以通过使用前向声明

来完成

Board.h

class Piece; // Forward declaration without defining the type

class Board
{
    // Board can makes use of Piece, only as long
    // as it does not need to know too much about it.
    // References and pointers are ok.
    Piece* foo();
    void bar(Piece&);
};

Piece.h

#include "Board.h"

class Piece
{
    // Actual definition of class.
    // At this point Board is fully defined and Piece can make use of it.
    Board* foo() { /*...*/ }
    void bar(Board& x) { /*...*/ }

    // Not only references are possible:
    Board baz(const Board x) { /*...*/ } 
};

Board.cpp

#include "Board.h"
#include "Piece.h"

// Implementation of Board's functions can go after Piece's definition:
Piece* Board::foo() { /*...*/ }
void Board::bar(Piece& x) { /*...*/ }

答案 1 :(得分:2)

此包含方案有2个备用视图。当包含piece.h时,所有board.h都包含在piece.h的主体之前。

当包含b​​oard.h时,所有piece.h都包括在板

之前

让课程一起工作

1)您需要至少预先声明一个班级。 2)要使用类,编译器需要使用引用(或指针)或知道大小。

class Board;

然后可以使用

void horizontal  ( Board & b );

不知道它的大小。

答案 2 :(得分:-1)

尝试将其放在&#34; piece.h&#34;

的顶部
 class Board;