我有一个非常小的问题。为什么这段代码会抛出以下错误?
字段next的类型不完整。
我声明了一个具有属性
的类#ifndef NODE_H
#define NODE_H
class Node
{
public:
int d;
Node(int d){
this->d = d;
}
Node next = 0;
};
#endif // NODE_H
BUT !!!如果我改变了指针的作用:
Node *next;
很有意思,因为这是来自破解编码面试的书。
有人可以对我有所了解吗? (最有可能让我感到羞耻:D)
提前致谢
答案 0 :(得分:5)
您正在声明类型为Node
的类,但该声明在到达右括号和分号之前尚未完成。
class Foo
{
}; // Class declaration is complete now
但是以下内容无效,请参阅代码注释。
class Node
{
public:
int d;
Node(int d){
this->d = d;
}
// This is a instance of a class and as such the compiler needs to
// know the full definition of the class. HOWEVER, this is the class
// that's being defined (i.e., it isn't fully defined yet!)
Node next = 0; // Assigning 0 here doesn't make any sense
};
BUT !!!如果我换一个指针工作
指针不需要完整的类型(即,不需要完整定义),因此在定义Node
类时可以使用它。
答案 1 :(得分:0)
我没有得到错误,这只是智能感知错误。
但是,Node
尚未完全定义,因此编译器不知道它是什么类型的对象,或者它占用了多少内存。
无论如何,我不认为这是问题所在。在Node
类本身内声明Node
对象会产生递归依赖,同样,编译器也无法解析Node
需要多少内存。
由于指针只是一个内存地址并且具有固定的大小,因此编译器很高兴并且可以声明它。