2017-01-26 18 views
0

Я новичок в C++. Недавно, когда я занимался написанием связанного списка, я попытался использовать список инициализации для моего конструктора классов, чтобы назначить NULL в head-> next.Почему я не могу использовать оператор со стрелкой в ​​списке инициализации?

В классе contructor он предупреждает, что оператор стрелки «ожидается a» («или« {»). Почему такая ошибка? (Я знаю, что могу инициализировать членов класса только в блоке, но почему «т я делаю это с этим указателем) Благодаря

Вот мой файл заголовка для LinkedList:!

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){} 
+2

Две проблемы: Прежде всего 'head' не инициализируется. Во-вторых, вы не можете иметь выражения в списке инициализаторов. –

+0

@Someprogrammerdude, что относительно постоянных выражений? –

+0

Почему? Потому что именно так был разработан язык. (Предположительно, списки инициализации всегда были предназначены для инициализации самого объекта, а не для других объектов, на которые его участники могли бы указывать.) – TheUndeadFish

ответ

1

В целом можно только инициализировать самих пользователей как часть списков инициализации. Если это была ваша единственная проблема здесь, вы могли бы просто инициализировать следующий указатель на NULL как часть тела ctor. Тем не менее, ваша переменная член head сам указатель, и в настоящее время не указывая в любом месте, так что я подозреваю, что вы на самом деле хотел, чтобы установить head сам к NULL (или nullptr, если вы используете C++ 11 или более поздней версии):

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

Вы также можете рассмотреть возможность добавления ctor в ваш struct node для инициализации next до NULL после инициализации.

Несколько других вещей, я думал, что может быть стоит отметить, так как вы сказали, что вы новичок:

  1. Обратите внимание, что списки инициализации не выполняются в порядке, они написаны в CTOR, а в порядке, в котором члены определены в классе. В данном случае здесь listlen фактически инициализируется 0 только после того, как инициализируется head. Это не имеет значения для вашего кода здесь, но может иметь значение, если инициализация членов более сложна и имеет зависимости. Лично я бы рекомендовал всегда сохранять порядок списков инициализации, соответствующих порядку определений членов. Некоторые компиляторы также имеют флаги, чтобы предупредить, если это не так.

  2. Вместо того чтобы реализовать свой собственный список ссылок, рассмотрели ли вы использование структуры данных из стандартной библиотеки? Посетите cppreference.com для получения большой информации об этом. В частности, проверьте «список», «вектор» или «deque» в зависимости от вашего варианта использования.

+0

Спасибо за ваш вклад! У меня будет порядок инициализации. И, что касается самой структуры данных, инициализируют указатель на голову как NULL и head-> next, поскольку NULL оба необходимы? –

+0

Если вы этого не сделаете, у них будет неопределенное значение, которое для указателей означает, что они являются недействительными и, скорее всего, приведет к SEGV, если вы попытаетесь разыменовать их. По этой причине, в большинстве случаев, вы хотели бы их инициализировать явно, чтобы впоследствии узнать о значении. Я говорю «в большинстве случаев», потому что иногда у вас может быть другое состояние вокруг, давайте вам гарантировать, что вы не будете обращаться к этим членам до тех пор, пока они не будут инициализированы. – TKL