C ++类错误

时间:2012-02-19 15:36:14

标签: c++ oop class

在第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;
                }
            }
}

6 个答案:

答案 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