我正在使用涉及多个课程的C ++制作棋盘游戏。当我在piece.h
中加入board.h
的标题文件时,所有作品的成员都被董事会识别。但是,当我同时将board.h
与piece.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;
答案 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的主体之前。
当包含board.h时,所有piece.h都包括在板
之前让课程一起工作
1)您需要至少预先声明一个班级。 2)要使用类,编译器需要使用引用(或指针)或知道大小。
class Board;
然后可以使用
void horizontal ( Board & b );
不知道它的大小。
答案 2 :(得分:-1)
尝试将其放在&#34; piece.h&#34;
的顶部 class Board;