我是c++的初学者。最近,在练习编写链表时,我尝试使用类构造函数的初始化列表将NULL分配给head->next。
在类构造函数中,它警告我的箭头运算符"应为"("或"{"。为什么会出现这样的错误?(我知道我可以在块中初始化类成员,但为什么我不能用这个指针执行此操作?)谢谢
这是我的链接列表头文件:
linkedlist.h
#include <iostream>
using namespace std;
struct node {
int val;
node *next;
};
class linkedlist {
private:
node *head;
int listlen;
public:
linkedlist();
void insert(node*, int);
void del(node*);
void reverse(node*);
void traverse(node*);
int random();
~linkedlist();
};
这是我的类构造函数:
链接列表.cpp
#include "linkedlist.h"
#include <iostream>
linkedlist::linkedlist() :listlen(0), head->next(NULL){}
通常,您只能将成员本身作为初始化列表的一部分进行初始化。如果这是您唯一的问题,那么您可以将指向NULL
的下一个指针初始化为ctor主体的一部分。但是,您的成员变量head
本身就是一个指针,并且当前不指向任何位置,所以我怀疑您实际上想将head
本身设置为NULL
(如果您使用的是c++11或更高版本,则为nullptr
):
linkedlist::linkedlist() :listlen(0), head(NULL) {}
您还可以考虑在struct node
中添加一个ctor,以便在初始化时将next
初始化为NULL
。
自从你说你是新人以来,我认为还有一些事情值得指出:
-
请注意,初始化列表不是按照在ctor中写入的顺序运行的,而是按照成员在类主体中定义的顺序运行。在您的情况下,这个
listlen
实际上只有在head
初始化之后才初始化为0。这对您的代码来说并不重要,但如果成员的初始化更复杂并且具有依赖关系,则可能很重要。就我个人而言,我建议始终保持初始化列表的顺序与成员定义的顺序相匹配。如果不是这样的话,某些编译器也有警告标志。 -
您是否考虑过使用标准库中的数据结构,而不是实现自己的链表?查看cppreference.com,了解更多关于它的好信息。特别是,根据您的用例,查看"list"、"vector"或"deque"。