2014-10-01 105 views
0

开始让我解释一下我在这里完成的任务,基本上我会在游戏中做一些基本的路径查找,并且为此我构造了一个非常简单的类,称为Node,节点内部有一些变量和函数,但为了使我的寻路算法能够正常工作,我需要能够返回到我正在查看的当前节点的父节点,所以我需要每个节点都包含它们的父节点,它毫无疑问更容易理解代码如此不好写下一些示例代码。在Foo中声明对象Foo?

我已经尝试过这样做,但即时通讯只是像“不完整的类型是不允许的”这样的错误,所以即时猜测我做了一些非常错误的事情。

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

所以它很容易看到什么即时试图在这里完成,我只是想有相同的类种,对不起,如果IM很难理解的对象,但我想我最好的解释,任何帮助将不胜感激。

+4

使用指针,而不是'节点* PARENT_NODE;',或更好的'的std :: weak_ptr的 PARENT_NODE;' – 2014-10-01 18:01:17

+0

这是不可能使用任何物体与未知大小为成员(在此节点是不完整的,它的最终大小未知) – 2014-10-01 18:08:32

+0

'Node(void);'不*只是*函数,而是*构造函数*。 – crashmstr 2014-10-01 18:18:41

回答

0

必须在成员字段限制的指针(节点*)。

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

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

你的原始样本将创建一个包含包含节点的节点节点...你可以在Java或C#中使用类似的符号,因为内联对象实际上是引用(指针),而不像C++那样内联。

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

ahh好吧,我明白了,谢谢你mate: )我会接受你的答案作为解决方案。 – Paze 2014-10-01 18:11:31

+0

答案是不正确的:构造函数:'Node():parent(new Node){}'完全没问题 – 2014-10-01 18:13:51

+0

你的短语'out-line'令人困惑。可以在类内部定义的任何构造函数/函数中使用'Node'(不代表Node *)。 – 2014-10-01 18:41:58

0

由于Node类的定义是不是你列入类本身Node类型的成员的时间完成,编译器还不能确定有多少空间分配为成员(这就是为什么它说成是“不完全“)。相反,如果使用C++ 0x,则使用Node*,如果使用C++ 11,则使用std::auto_ptr<Node>;如果使用C++ 11,则使用std::weak_ptr<Node>

参见:Next struct item,incomplete type

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

哦,是的,使功能做某件事,或者将其删除。对我而言,当我尝试它时,会造成构建错误。它工作时,我删除了该功能。

相关问题