在Foo中声明对象Foo

Declaring object Foo inside Foo?

本文关键字:Foo 对象 声明      更新时间:2023-10-16

首先,让我解释一下我在这里试图实现的目标,基本上我在游戏中做一些基本的路径查找,为此我构建了一个非常简单的类,名为Node,在Node内部我有一些变量和函数,但为了让我的寻路算法发挥作用,我需要能够回到我正在查看的当前节点的父节点,所以我需要每个节点都包含它们的父节点。在代码中可能更容易理解,所以我会写下一些示例代码。

我试过这样做,但我只是收到了一个错误,比如"不允许不完整类型",所以我猜我在这里做错了什么。

class Node {
      int f_score, g_score, h_score; //just a few variables used for pathfinding.
      Node parent_node; //parent node as explained above
      Node(void); //just a function.
}

所以很容易看出我想在这里完成什么,我只是想有一个同类的对象,很抱歉,如果我很难理解,但我尽力解释了,任何帮助都将不胜感激。

必须将成员字段限制为一个指针(节点*)。

不能使用内联对象成员,因为此时编译器尚未"关闭"Node类型。

  1. 需要了解对象的存储大小
  2. 将创建一个无限递归的类型定义

您的原始示例将创建一个包含Node的Node。。。您可以在Java或C#中使用类似的表示法,因为内联对象实际上是引用(指针),而不是像C++那样内联。

class Node {
   Node * parent;
public:
   Node() : parent(nullptr) {}
   Node(Node*parent)
      : parent(parent)  // this is ok
   {
   }
}; // type is now closed

由于在类本身中包含Node类型的成员时,类Node的定义还不完整,编译器还无法确定为该成员分配多少空间(这就是为什么它被称为"不完整")。相反,对成员使用类型Node*,如果使用C++0x,则使用类型std::auto_ptr<Node>,如果使用C++11,则使用std::weak_ptr<Node>

另请参阅:下一个结构项,不完整类型

将其公开。试试这个:

    class Node {
        //Make it public so it's accessible.
        public:
            int f_score, g_score, h_score;
            Node* parent_node;
            //Make the "Node(void);" function do something or take it out.
    };

哦,是的,让函数做点什么或删除它。对我来说,当我尝试它时,它会导致构建错误。当我删除函数时,它起作用了。