【问题标题】:Why do I need to declare Node as a struct in the Node struct and not just as a Node object?为什么我需要将 Node 声明为 Node 结构中的一个结构,而不仅仅是一个 Node 对象?
【发布时间】:2020-10-27 19:25:22
【问题描述】:

我正在创建堆栈的链表实现。在Node 结构中,我有数据成员datanext。我的问题是,为什么数据成员next 需要声明为struct Node * next 而不仅仅是Node *next

template <class T>
class Stack{
    private:
        struct Node{
            T data;
            struct Node *next; //This is what the question is in reference to
        };

        Node *front;
        Node *end;

    public:
};

【问题讨论】:

  • 如果这是 C,您将需要 struct,但不是。我猜你实际上没有尝试过。

标签: c++ struct linked-list queue declaration


【解决方案1】:

在这种情况下,可以写成Node *next; 而不是struct Node *next;,它不会改变意思。关键字struct 的包含是多余的,如果我不得不猜测,作者包含它是因为他们习惯于用 C 编写,其中(与 C++ 相比)它可能不会被省略。

【讨论】:

    【解决方案2】:

    在C++中这两个结构定义

    struct Node{
        T data;
        struct Node *next;
    };
    

    struct Node{
        T data;
        Node *next;
    };
    

    是等价的。在结构定义中,名称Node 是注入的类名称。

    来自 C++ 20 标准(6.4.2 声明点)

    8 注入类名 (11.1) 的声明点是 紧跟在类定义的左大括号之后。

    相对于C++中C这个结构定义

    struct Node{
        T data;
        Node *next;
    };
    

    无效,因为名称 Node 在此记录中用作标记名称 struct Node 和名称 Node 在此成员声明中使用 Node *next; 属于不同的名称空间。此数据成员声明中的名称Node

    Node *next;
    

    尚未声明。

    你可以通过使用 typedef 来使 C 中的结构定义有效

    typedef struct Node Node;
    
    struct Node{
        T data;
        Node *next;
    };
    

    注意,如果你想定义一个堆栈,那么数据成员

    Node *end;
    

    是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多