为什么我不能在初始化列表中使用箭头操作符?

时间:2017-01-26 04:53:53

标签: c++ pointers linked-list class-members initialization-list

我是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();

};

这是我的班级构造函数:

linkedlist.cpp

#include "linkedlist.h"
#include <iostream>

linkedlist::linkedlist() :listlen(0), head->next(NULL){}

1 个答案:

答案 0 :(得分:2)

通常,您只能将成员本身初始化为初始化列表的一部分。如果这是你唯一的问题,那么你可以将NULL的下一个指针初始化为ctor主体的一部分。但是,您的成员变量head本身就是一个指针,当前并未指向任何位置,因此我怀疑您确实希望将head本身设置为NULL(或nullptr #39;重新使用c ++ 11或更高版本):

linkedlist::linkedlist() :listlen(0), head(NULL) {}

您还可以考虑在初始化时向struct node添加一个ctor以初始化nextNULL

我认为可能值得指出的其他一些事情,因为你说过你是新的:

  1. 请注意,初始化列表不是按照它们在ctor中写入的顺序运行,而是按照在类中定义成员的顺序运行。身体。在您的情况下,此listlen实际上仅在初始化head后初始化为0。这对你的代码来说并不重要,但是如果成员的初始化更复杂并且具有依赖性,则可能很重要。就个人而言,我建议始终保持初始化列表的顺序与成员定义的顺序相匹配。如果不是这种情况,某些编译器也会有警告标志。

  2. 您是否考虑过使用标准库中的数据结构,而不是实现自己的链表?查看cppreference.com以获取有关它的大量重要信息。特别是,请查看&#39;列表&#39;,&#39;向量&#39;或者&#39; deque&#39;取决于您的使用案例。