为什么需要在Node结构中将Node声明为结构,而不仅仅是Node对象?

时间:2020-10-27 19:25:22

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

我正在创建堆栈的链表实现。在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:
};

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

是多余的。