【问题标题】:Class definition error - Field next has incomplete type类定义错误 - 下一个字段的类型不完整
【发布时间】:2015-04-16 03:05:22
【问题描述】:

我有一个非常小的问题。为什么这段代码会抛出以下错误?

下一个字段的类型不完整。

我在声明一个类,它有一个属性

#ifndef NODE_H
#define NODE_H

class Node
{
public:

    int d;

    Node(int d){
        this->d = d;
    }

    Node next = 0;

};

#endif // NODE_H

但是!!!如果我更改为指针有效:

Node *next;

很有趣,因为这是来自破解编码面试的书。

谁能给我一些启示? (很可能让我感到羞耻:D)

提前致谢

我做了功课,我找不到解决方案herehere

【问题讨论】:

  • 这和Qt有什么关系?

标签: c++


【解决方案1】:

您正在声明一个 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

};

但是!!!如果我更改为指针工作

指针不需要完整的类型(即不需要完整的定义),因此在定义Node 类的同时使用它就可以了。

【讨论】:

  • 我在想象这样的事情。零的原因是而不是空。我想要 null 因为这个 Node 类被认为是用于树、链表等......并且需要 null(或未初始化)元素来理解我们到了最后。无论如何,谢谢你的解释。
  • @DavidSánchez 是的,零可用于初始化指针,但我对它没有意义的评论是当类型为 Node 时(即在这种情况下它不是指针)。
【解决方案2】:

这不是我得到的错误,这只是智能感知错误。

但是,Node 还没有完全定义,所以编译器不知道它是什么类型的对象,或者它占用了多少内存。

无论如何,我认为这不是问题所在。在Node 类本身中声明Node 对象会创建递归依赖项,而且编译器将无法解析Node 需要多少内存。

由于指针只是一个内存地址并且具有固定大小,编译器很高兴并且可以声明它。

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2011-04-29
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2018-05-11
    • 2012-05-20
    相关资源
    最近更新 更多