C++ C++;用继承解决循环依赖

C++ C++;用继承解决循环依赖,c++,inheritance,circular-dependency,forward-declaration,C++,Inheritance,Circular Dependency,Forward Declaration,继承让我很难解决这个问题 我正在制作一个国际象棋游戏,其中我创建了一个接口棋子,它将表示每个棋子的共享函数和私有成员。我为每个片段创建一个类(Rook,Bishop等) 我的board文件中的构造函数负责创建和初始化带有指向工件对象指针的board board[0][0] = new Rook(GameData::BLACK); board[1][0] = new Knight(GameData::BLACK); board[2][0] = new Bishop(GameData::BLACK)

继承让我很难解决这个问题

我正在制作一个国际象棋游戏,其中我创建了一个接口
棋子
,它将表示每个棋子的共享函数和私有成员。我为每个片段创建一个类(
Rook
Bishop
等)

我的board文件中的构造函数负责创建和初始化带有指向工件对象指针的board

board[0][0] = new Rook(GameData::BLACK);
board[1][0] = new Knight(GameData::BLACK);
board[2][0] = new Bishop(GameData::BLACK);
board[3][0] = new Queen(GameData::BLACK);
board[4][0] = new King(GameData::BLACK);
board[5][0] = new Bishop(GameData::BLACK);
.
.
.
现在我遇到了问题,因为在每个工件类(bishop.cpp等)中都有一个名为
validMoves
的方法,它接收
板上的对象和坐标

std::vector<GameData::BoardPosition> Bishop::validMoves(Board &b, BoardPosition src) {
只需使用一个简单的:

#include "board.h"

int main() {
    Board b;
    return 0;
}
我尝试了向前声明,但只有当我有了定义而没有使用它时,它才起作用:

有效

.
.
.
class Board;
.
.
.
test(Board &b);
不起作用

.
.
.
class Board;
.
.
.
test(Board &b) {
    b.getMove(...);
}

您可能需要更改设计,以便每个零件都包含一个位置。这将允许您为每个玩家提供一个包含棋子的容器。你甚至可以有一个碎片墓地

struct Position
{
  unsigned int row;
  unsigned int column;
};

class Piece
{
//...
  Position location; //!< Each piece has a location on the board.
};
struct位置
{
无符号整数行;
无符号整数列;
};
班级作品
{
//...
位置位置;//!<每个工件在板上都有一个位置。
};
使用此设计,您可能不需要board对象。您可以根据工件的位置计算要进行的移动


这个概念遵循真实的单词映射:玩家知道棋子的位置。一个球员改变他的棋子的位置。当一个玩家的棋子与另一个玩家的棋子位置相同时,就会发生冲突。

您需要在头文件中向前声明引用的类,然后在实现文件中包含类声明头

1.hpp

班级委员会

件.cpp


包括“board.hpp”

托马斯·马修斯提出了一个很好的建议。如果你和你的棋盘概念结合在一起,你可以把它变成一个接口类(纯虚拟的抽象基类=0),并从你的棋盘类派生出一个棋盘类。然后,您的所有部件都将通过Board接口调用函数。

我找到了一个项目的源文件,该项目的设置与我的相同

https://github.com/cpluspluscom

他们通过使用名称空间并在board标头中声明piece接口来解决此问题。

您认为有人会经历6个pastebin吗?在您的“不工作”示例中,编译器需要有关类
board
的更多详细信息,以便验证
getMove
方法。将类声明放在头文件中,并将该文件包含在源文件中。piece.h文件中包含board实现(这是一个小函数)。那么我该怎么办呢?拆分文件,并为每个类创建一个declaration.hpp和一个implementation.cpp。
struct Position
{
  unsigned int row;
  unsigned int column;
};

class Piece
{
//...
  Position location; //!< Each piece has a location on the board.
};
https://github.com/cpluspluscom