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

C++ 类型错误标题不完整--如何修复?,c++,C++,我想我已经掌握了如何修复循环依赖项的方法,但我就是无法修复下面的问题,所以如果有任何帮助,我将不胜感激 我正在写一个国际象棋程序,我有一个类棋子 它位于Pieces.cpp文件中,包括Pieces.h 件.h包括Rook.h Rook.h包括棋子.h 棋子.h包括棋盘.h 现在, 棋盘.h包括棋子.h 我到处都有警卫,所以一切正常;除了棋盘实际上拥有棋子,而不仅仅是拥有指向棋子的指针/参考: private: Pieces black_pieces; Pieces white_p

我想我已经掌握了如何修复循环依赖项的方法,但我就是无法修复下面的问题,所以如果有任何帮助,我将不胜感激

我正在写一个国际象棋程序,我有一个类
棋子

它位于Pieces.cpp文件中,包括Pieces.h

件.h包括Rook.h

Rook.h包括棋子.h

棋子.h包括棋盘.h

现在,

棋盘.h包括棋子.h

我到处都有警卫,所以一切正常;除了
棋盘
实际上拥有棋子,而不仅仅是拥有指向棋子的指针/参考:

private:
    Pieces black_pieces;
    Pieces white_pieces;
我做了一个
片段的转发声明
,但是编译器抱怨这一行的类型不完整。我可以理解原因:此时,编译器不知道为类型为
片段的类分配多少空间,尽管它从我的转发声明中知道存在一个空间

我的问题是我想要
棋盘
来存储这些
片段
对象,所以我不能简单地让指针指向它们。我想我可以把它们放在堆上,但我听说使用堆通常是不被鼓励的。这是一个可能有用的案例,还是我忽略了一个解决方案

我希望我的解释是可以理解的,即使没有张贴代码-将有很多


感谢您的帮助。

转发声明适用于成员引用和指针。在另一个类/结构中声明类或结构的实例时,需要完整声明

您的问题听起来似乎与您的设计/架构有问题。
一辆
Rook
是一辆
Chess\u棋子
。好的,听起来不错

片段
听起来模棱两可。
您是否需要一种专门的类型来容纳片段,或者可以使用
std::vector

棋盘
应包含零个或多个
棋子实例
。一个常见的实现是指向
国际象棋棋子的2d指针数组。指针有助于支持polymorhphism

另一个实现可以是一个向量。这是一种认为棋盘上不同位置有棋子的观点

编辑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;
  }
};
class工件\u工厂
{
静态std::向量白色棋子;
静态std::向量黑_兵;
静态皇后白色(白色);;
静态皇后黑(黑);;
公众:
工件加工厂()
{
当铺wp(白色);
典当bp(黑色);
for(无符号整数i=0;i<8;++i)
{
white_pawns.push_back(wp);//将副本附加到向量。
黑色棋子。推回(bp);
}
}
国际象棋棋子*白棋棋子(无符号整数索引)
{
返回和白ú典当[索引];
}
国际象棋棋子*获得白棋皇后(无效)
{
返回和白皇后区;
}
};

您需要事先完整申报
,请更正。但是你可以这么做,不是吗?但是怎么做呢?我的
棋子
包括另一个标题,其中包括
棋盘
。因此,当它运行其预处理器指令时,它总是将
棋盘
放在
棋子
之前……嗯,只需更改包含顺序,使
棋子.h
不包括
Rook.h
(或
Rook.h
不包括
棋盘.h
),相反,它只是看到一个向前声明的
棋盘
(而不是现在的情况)。另一个标题中的类,它真的需要
棋盘
的完整定义,还是只需要
棋盘
的指针/引用就可以管理?或者您真的需要
Pieces.h中其他头文件中的完整定义吗?是的,在头文件中提出前向声明并在相应的源文件中包含该类型的实际定义通常很有用。谢谢您的回答!如果我真的去寻找指针向量,我应该把实际的
Chess\u棋子
s存储在哪里?因为棋子的数量是固定的,你可以将它们声明为文件局部变量并返回指向它们的指针;不需要动态内存。这与我们在嵌入式系统上所做的类似,以防止需要动态分配。