我认为我已经掌握了如何修复循环依赖关系,但我无法修复以下内容,所以我将不胜感激任何帮助!
我正在写国际象棋程序,我有一个班级Pieces
。
它位于文件Pieces.cpp中,包含Pieces.h。
Pieces.h 包括 Rook.h.
Rook.h 包括 ChessPiece.h
ChessPiece.h 包括 ChessBoard.h。
现在,
ChessBoard.h 包含 Pieces.h。
我到处都有警卫,所以一切都好;除了ChessBoard
实际上拥有 Pieces而不仅仅是指向它们的指针/引用:
private:
Pieces black_pieces;
Pieces white_pieces;
我做了Pieces
的前向声明,但编译器抱怨此行上的类型不完整。我可以理解为什么:此时,编译器不知道为类型Pieces
的类分配多少空间,尽管它知道我的前向声明中存在一个空间。
我的问题是我希望ChessBoard
存储这些Pieces
个对象,所以我不能简单地指向它们。我想我可以将它们放在堆上,但我听说通常不鼓励使用堆。这是一个可能有用的案例,还是我可以忽略的解决方案?
我希望即使不发布代码我的解释也是可以理解的 - 会有很多代码!
感谢您的帮助。
答案 0 :(得分:1)
前向声明适用于成员引用和指针。在另一个类/结构中声明类或结构的实例时,需要完整的声明。
您的问题听起来像是您的设计/架构存在问题
Rook
是一个Chess_Piece
。很好,听起来不错。
班级Pieces
听起来含糊不清
您是否需要专门的类型来包含作品?或者您可以使用std::vector<Chess_Piece*>
吗?
Chessboard
应该包含零个或多个Chess_Piece
个实例。常见的实现是指向Chess_Piece
的2d指针数组。指针有助于支持多态性。
另一个实现可能是一个向量。这是认为棋盘在棋盘上的不同位置具有棋子。
编辑1:作品分配
我建议有一个 factory ,它返回指向这些部分的指针。由于碎片的数量是已知的并且不会改变,因此可以将它们分配为静态自动变量。
class Piece_Factory
{
static std::vector<Pawn> white_pawns;
static std::vector<Pawn> black_pawns;
static Queen white_queen(white);
static Queen black_queen(black);
public:
Piece_Factory()
{
Pawn wp(white);
Pawn bp(black);
for (unsigned int i = 0; i < 8; ++i)
{
white_pawns.push_back(wp); // Append a copy to the vector.
black_pawns.push_back(bp);
}
}
Chess_Piece * get_white_pawn(unsigned int index)
{
return &white_pawn[index];
}
Chess_Piece * get_white_queen(void)
{
return &white_queeen;
}
};