【问题标题】:Defining a struct parameter with the type of the struct itself使用结构本身的类型定义结构参数
【发布时间】:2015-11-16 00:14:40
【问题描述】:

我正在尝试将 BFS 算法启动到矩阵中,以获得从我的位置到 BFS 找到的第一个可访问元素的最短路径。矩阵由如下定义的节点组成:

    struct node {
    int distance = -1;
    node parent;
    Pos position;
    //Direction to get into the actual node from the parent's position.
    Dir direction;
    Cell cell;
 };

一旦找到所需的项目,我需要有一个父节点的实例(先前访问过的并且与初始节点的距离小于实际节点的距离)以追踪返回原始节点的最快路径。但是似乎 node parent; 声明会抛出错误,所以可以用 struct 本身的类型声明 struct 的元素吗?还是我必须将其声明为指向元素的指针?

这里有错误:

error: field has incomplete type 'node' 
       node parent;
            ^
note: definition of 'node' is not complete until the closing '} 
      struct node {
             ^

谢谢。

【问题讨论】:

  • 您需要使用指针。一个节点不能包含另一个节点对象,因为该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,该节点本身将包含另一个节点,依此类推。跨度>
  • 如果你能做到这一点 - 让一个结构包含自身 - 想想你如何计算这样一个结构的大小以及这意味着什么......
  • 选择一种语言。

标签: c++ c pointers struct forward-declaration


【解决方案1】:

这是不可能的。结构不能包含自身的实例。

C++(和 C)具有值语义。也许您正在使用另一种语言的心智模型,其中parent 表示对存储在其他地方的对象的引用。

但在 C++ 中,node parent; 表示一个名为 parent 的对象,它完全存储在外部对象中。因此,您的代码将导致对象的无限“深度”。

根据您的描述,您可能是指引用另一个实际存储在其他地方的节点。在 C 中你会写node *parent;,然后要非常小心。在 C++ 中,您有几个选项,包括 weak_ptr<node> parent;

在这两种语言的情况下,非侵入式容器是另一种选择(即您的节点不包含任何节点引用;并且您有另一个结构,其中包含有关节点链接的所有信息)。

【讨论】:

    【解决方案2】:

    可以用结构本身的类型声明结构的元素吗?

    没有。

    你不能根据自身来定义事物。

    如果汽车总是包含自己的精确副本怎么办?那行得通吗?不!它不适合。

    会有多大?汽车的尺寸将是它的车轮、座椅、方向盘以及,呃,另一辆车的尺寸之和……加上它的车轮、座椅、方向盘,以及,呃,另一辆车……嗯……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多