我以为我有解决循环依赖项的方法,但是我无法解决以下问题,因此,我将不胜感激!
我正在写国际象棋程序,并且上了一堂课Pieces
。
它在Pieces.cpp文件中,并且包含Pieces.h。
Pieces.h包括Rook.h。
Rook.h包括ChessPiece.h
ChessPiece.h包括ChessBoard.h。
现在,
ChessBoard.h包括Pieces.h。
我到处都有警卫,所以一切顺利。除了ChessBoard
实际拥有作品而不是仅拥有它们的指针/引用:
private:
Pieces black_pieces;
Pieces white_pieces;
我做了的前向声明Pieces
,但是编译器抱怨此行上的类型不完整。我可以看到原因:在这一点上,编译器不知道要为一个类型的类分配多少空间Pieces
,尽管它知道我的前向声明中存在一个空间。
我的问题是我想ChessBoard
存储这些Pieces
对象,所以我不能简单地拥有指向它们的指针。我想我可以将它们放在堆上,但是我听说通常不建议使用堆。是在这种情况下可能会有用,还是有我忽略的解决方案?
我希望即使不发布代码也能理解我的解释-会有很多!
谢谢你的帮助。
前向声明适用于成员引用和指针。在另一个类/结构中声明类或结构的实例时,您需要完整的声明。
您的问题听起来像您的设计/体系结构有问题。
A Rook
is-a Chess_Piece
。很好,听起来不错。
班级Pieces
听起来模棱两可。
您是否需要专门的类型来容纳物件或可以使用std::vector<Chess_Piece*>
?
AChessboard
应该包含的零个或多个实例Chess_Piece
。常见的实现是指向的2d指针数组Chess_Piece
。指针有助于支持多态性。
另一个实现可以是的向量。认为国际象棋棋盘在棋盘上的不同位置都有棋子。
编辑1:碎片的分配
我建议有一个工厂,该工厂返回指向碎片的指针。由于件数是已知的并且不会更改,因此可以将它们分配为静态的自动变量。
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;
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句