在Foo中声明对象Foo?

时间:2014-10-01 18:00:02

标签: c++ class oop object

首先让我解释一下我在这里要完成的事情,基本上我在游戏中做一些基本的寻路,为此我构建了一个非常简单的类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.
}

所以我很容易看到我想在这里完成什么,我只想尝试一个同类的对象,对不起,如果我很难理解,但我尽力解释,任何帮助都将大大赞赏。

3 个答案:

答案 0 :(得分:0)

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

另请参阅:Next struct item,incomplete type

答案 1 :(得分:0)

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

您不能使用内联对象成员,因为此时编译器尚未关闭&#34;节点类型。

  1. 需要了解对象的存储大小
  2. 将创建无限递归类型定义
  3. 您的原始示例将创建一个包含节点的节点,其中包含节点...您可以在Java或C#中使用类似的表示法,因为内联对象实际上是引用(指针),而不像C ++那样内联。

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

答案 2 :(得分:0)

公开宣传。试试这个:

    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.
    };

哦,是的,让功能做某事或删除它。对我来说,当我尝试它时,它会导致构建错误。当我删除该功能时它起作用了。

相关问题