在第3行“Node next”中编译器给我一个不完整的类型错误。我认为它将它视为成员函数而不是属性。这个定义有什么问题?
class Node {
private:
Node next;
Node previous;
int value;
int min;
public:
Node(int value) {
this.value = value;
this.min = value;
}
void insert(Node node) {
if (this.next != null) {
this.next.insert(node);
}
else {
this.next = node;
node.previous = this;
}
}
}
答案 0 :(得分:4)
首先,this
是指针,而不是引用,因此您需要将所有this.
替换为this->
。
其次,您不能在该类中存储类的实例,因为该类的大小将是无法计算的。您只能在类本身内存储类的指针或引用,因为编译器可以计算指针的大小或对任何类的引用,而不必具有该类的任何细节(因为这些指针)无论底层对象如何,/ references都是相同的大小。变化
Node next;
Node previous;
到
Node* next;
Node* previous;
// or Node* next, *prev;
并改变
void insert(Node node)
到
void insert(Node* node)
您还需要在对象的构造函数中初始化成员指针NULL
(而不是null
)(因为C ++不初始化内在(内置)类型的变量(如(指针))):
Node(int value) {
this->previous = NULL;
this->next = NULL; // or: previous = next = NULL;
this->value = value;
this->min = value; // or: this->value = min = value;
}
// or with initialiser lists (but don't get confused if you don't understand)
// Node(int value) : previous(), next(), value(value), min(value) { }
此外,我(与所有其他人一样)推断出(使用对象,例如它们是引用和使用null
而不是NULL
以及“方法”和“属性”这两个词你是一个学习C ++的Java或C#程序员。请立即停止并阅读a good book on C++,因为C ++与Java或C#完全不同,如果您在编写C ++时尝试使用C#/ Java经验,那么您最终只会因为沮丧而扯掉自己的脑袋。 / p>
答案 1 :(得分:2)
使用指针,而不是对象。
Node * next;
Node * previous;
然后
Node(int value) : next(NULL), previous(NULL) {/**/}
然后
void insert(Node * node) {/**/}
答案 2 :(得分:1)
看起来你正试图用C ++编写Java / C#!
在C ++中,对象按值存储,而不是按引用存储。所以在这样的事情:
class Node {
Node next;
};
您要求Node
在其中存储另一个Node
,这需要无限量的存储空间。
也许您希望将指针存储到下一个和上一个节点。
答案 3 :(得分:0)
C ++没有“类属性”的概念。在类范围内声明的任何变量都是(可能是静态的)成员。因此,包含自己类型成员的类是荒谬的。例如,
struct S {
S s;
int i;
};
合法意味着sizeof(S) == sizeof(S) + sizeof(int)
,忽略填充。由于情况显然不是这样,所以是禁止的。
如果您希望Node
有指向其他Node
的指针(您可能会这样做),则应该给它Node*
成员。您还应该将Node*
传递给insert
,而不是Node*
。
顺便说一下,C ++通常不会像C#那样定义null
。您可以将指针与NULL
,0或nullptr
进行比较。
答案 4 :(得分:0)
正在定义类Node
,在执行此操作时,您无法定义Node
类型的任何成员,因为Node
的大小尚未确定。试想一下,编译计算机的大小如何Node
?要计算sizeof(Node)
,编译器需要知道每个成员的大小,但其中两个成员的类型为Node
,其大小正在计算中。
解决方案是将它们定义为指针:
Node *next;
Node *previous;
现在Node
的大小是可计算的,因为每个成员的大小已经知道。请注意,任何类型的指针大小都等于sizeof(void*)
1 ,这意味着sizeof(Node*)
等于已知的sizeof(void*)
。
1。 sizeof(pointer-to-member)
除外sizeof(void*)
可能不同。从技术上讲,对于许多编译器来说,指向成员的指针不是指向开头的指针;他们是不同的动物。
答案 5 :(得分:0)
您无法嵌套这样的对象。想一想 - Node
的大小是多少?好吧,因为每个Node
恰好包含2个其他Node
s,这意味着它将具有无限大小。
您需要一种方法让您的孩子为空,因此解决方案是使用Node*
代替Node
。