我正在创建堆栈的链表实现。在Node
结构中,我有数据成员data
和next
。我的问题是,为什么数据成员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:
};
答案 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;
是多余的。