为什么我不能在同一行中定义两个相同类型的类的成员指针

Why can't I define two member pointers that are the same type of the class in the same row

本文关键字:指针 两个 同类型 成员 不能 为什么 一行 定义      更新时间:2023-10-16

此代码生成如下错误

错误:"下一步"字段的类型不完整"节点">

class Node {
public:
Node(int k, int v) {
key = k;
val = v;
}
public:
Node* prev, next;
int key, val;
};

将节点*更改为int不会有相同的抱怨。将上一个和下一个放入单独的行中可以解决错误。

为什么不能在同一行中定义两个与类类型相同的成员指针?

星号 (*( 属于变量名称。Node是数据类型。 实际上,您已经定义了:

Node *prev;
Node next;

next前面添加一个星号,例如*next.

该错误与以下事实有关:在执行此操作时,您未能初始化存储在next中的Node实例。prev是一个指针,不需要初始化。

你可以,你必须执行以下操作:

Node* prev,* next;

人们通常会对这种表示法感到困惑:

Node* prev, next;

认为他们声明了 2 个指针,但他们声明了一个指针* next和一个节点的实例,并认为这与

Node* prev;
Node* next;

但事实并非如此,它与

Node* prev;
Node next;

我建议使用

Node *prev, *next;

并永远记住,对于声明的每个指针,您需要在其前面*

虽然写Node* prev是一种很好的做法,星号向左对齐,但多变量声明是一种边缘情况,暴露了C++语法(主要继承自 C(不这么看的事实。它将*"绑定"到名称,而不是类型,因此它"看起来像"内部Node *prev

因此,您实际上已经创建了:

Node* prev;
Node  next;

...第二个声明是不可能的,因为你在Node定义之内。

您可以通过以下方式修复它:

Node *prev, *next;

或者这样:

Node* prev, *next;

但后者在风格上内部不一致,前者与代码中其他地方使用的左对齐不一致。当然,您可以开始在任何地方正确对齐星号以重新引入一致性,但这还有更多缺点,对于这种边缘情况来说不值得。

我认为你真正应该做的是将声明一分为二:

Node* prev;
Node* next;

无论如何,这可以说更整洁。