类型错误标头不完整-如何解决?

夜光

我以为我有解决循环依赖项的方法,但是我无法解决以下问题,因此,我将不胜感激!

我正在写国际象棋程序,并且上了一堂课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 Rookis-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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章