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