不完整的类型错误标题 - 如何修复?

时间:2014-12-05 19:48:41

标签: c++

我认为我已经掌握了如何修复循环依赖关系,但我无法修复以下内容,所以我将不胜感激任何帮助!

我正在写国际象棋程序,我有一个班级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个对象,所以我不能简单地指向它们。我想我可以将它们放在堆上,但我听说通常不鼓励使用堆。这是一个可能有用的案例,还是我可以忽略的解决方案?

我希望即使不发布代码我的解释也是可以理解的 - 会有很多代码!

感谢您的帮助。

1 个答案:

答案 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;
  }
};