为什么我不能在同一行中定义两个相同类型的类的成员指针
Why can't I define two member pointers that are the same type of the class in the same row
此代码生成如下错误
错误:"下一步"字段的类型不完整"节点">
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;
无论如何,这可以说更整洁。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- C++两个对象,其中包含指向同一数组不同部分的指针
- 比较两个 constexpr 指针不是 constexpr?
- 在两个.cpp文件之间定义全局类/结构指针
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何仅考虑 *指针中的前两个元素
- 如果将两个相同的指针作为输入传递,memcmp 会做什么?
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- C++如何同时删除位于两个向量中的 2 个指针?
- 如何将值添加到嵌套结构中,该结构在C++中有两个指针
- 比较两个指针时">="运算符的奇怪行为
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 有没有更好的方法来添加两个智能指针?
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 两个类别的两个类,有指向另一堂课的指针
- 错误 :"+" 无法添加两个指针