Хорошо, проблема здесь тонкая (до такой степени, что я сначала не видел проблему).
Проблема в том, что вы инициализируете, используя значение n (this->n
) во время инициализации члена класса.
Проблема в том, что в C ++ все эти инициализаторы запускаются во время члена инициализация, предшествующая телу конструктора. Поскольку вы не устанавливаете значение this->n
до тех пор, пока тело конструктора не будет инициализировано this->n
Другими словами, то, что у вас есть, равнозначно написанию
hasing(int num): l(new LinkedList[n]) {
this->n = num;
}
Это происходит потому, что по умолчанию все члены инициализируются в порядке, указанном в классе, при необходимости заменяя инициализаторы членов по умолчанию (выражение после =
в определении класса).
Существует несколько решения:
Использование инициализатора элемента
hashing(int num): n(num),l(new LinkedList[n])
{
}
Использование тела конструктора:
hashing(int num)
{
this->n = num;
this->l = new LinkedList[n];
}
В обоих В вышеуказанных случаях я бы не стал указывать спецификатор члена по умолчанию. Я бы просто объявил указатель.
LinkedList* l; // No default member initializer
Наконец, я бы позаботился о том, чтобы вы правильно обрабатывали уничтожение и копирование / перемещение назначения.