C ++使用继承解析循环依赖

时间:2014-01-16 19:33:29

标签: c++ inheritance circular-dependency forward-declaration

继承让我难以解决。

我正在制作国际象棋游戏,我创建了一个界面Piece,它将代表每个国际象棋棋子的共享功能和私人成员。我为每个部分创建了一个类(RookBishop等。)。

chessmen/
bishop.cpp
bishop.h
piece.h

src/
board.cpp
board.h

我的电路板文件中的构造函数负责使用指向片段对象的指针创建和初始化电路板。

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的方法,它接收一个Board对象并在棋盘上进行坐标。

std::vector<GameData::BoardPosition> Bishop::validMoves(Board &b, BoardPosition src) {

由于董事会参考了所有的部分和部分参考了董事会,我不知道如何解决这个问题。我知道人们说循环依赖是一个糟糕的设计的标志,但我喜欢每个班级负责他们自己的规则 - 做一个非常干净的设计,并允许我跟踪片状态(hasBeenMoved)。 / p>

以下是我的文件:

http://pastebin.com/1AUhTjHL
http://pastebin.com/31mBTfY1
http://pastebin.com/n4VNT0JH
http://pastebin.com/snUTdJ8p
http://pastebin.com/HjCew9gx
http://pastebin.com/eKA5XmWh

只需使用简单的:

#include "board.h"

int main() {
    Board b;
    return 0;
}

我尝试向前声明,但它只有在我有定义而不使用它时才有效:

作品

.
.
.
class Board;
.
.
.
test(Board &b);

不起作用

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

4 个答案:

答案 0 :(得分:0)

您可能想要更改设计,以便每个部分都包含位置。这将允许您为每个玩家拥有一个容器。你甚至可以拥有一块碎片。

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

class Piece
{
//...
  Position location; //!< Each piece has a location on the board.
};

使用此设计,您可能不需要板对象。你可以根据一个棋子的位置计算出哪个动作。

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

答案 1 :(得分:0)

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

piece.hpp

班级委员会;

piece.cpp

包括“board.hpp”

答案 2 :(得分:0)

托马斯马修斯提出了一个很好的建议。如果您已与Board概念结合,则可以将其转换为接口类(具有纯virtuals = 0的抽象基类),并从Board类派生ChessBoard类。然后,您的所有作品将通过Board界面调用这些功能。

答案 3 :(得分:0)

我发现项目的源文件与我的设置相同。

https://github.com/cpluspluscom

他们通过使用名称空间并在棋盘标题中声明了棋子界面来解决它。