Ваш конструктор выделяет массив просто отлично (хотя убедитесь, что остальная часть вашего класса правильно реализует правило 3/5/0 ), но он не заполняет массив какими-либо начальными значениями.
С другой стороны, у вашего insert()
есть несколько проблем:
он перебирает 1 слишком много элементов.Массивы имеют индекс 0, что означает, что допустимые индексы будут 0..sz-1
, поэтому вам нужно использовать <
вместо <=
в цикле.
elts[i];
hasn 'на самом деле делать что-то значимое.Он просто читает значение из массива (в случае, когда i
совпадает со значением numElts
, он будет считывать конец массива в окружающую память), но он ничего не делает с этим значением.
if (i = position)
присваивает значение position
i
, а затем оценивает результат этого назначения (новыйзначение i
) как логическое выражение.Таким образом, если position
равно 0, тогда вообще ничего не происходит, поскольку 0 оценивается как ложное, но любое другое значение будет оцениваться как истина, и каждая итерация цикла (включая упомянутое выше 1 ошибочное значение) будет присваивать value
указанному индексу массивана position
, что само по себе может выйти за границы массива, поскольку вы его не проверяете.Чтобы сравнить исходное значение i
как есть со значением position
, вам нужно использовать операцию сравнения ==
вместо оператора присваивания =
.
Вместо этого попробуйте что-то вроде этого:
Sequence::Sequence(size_type sz)
{
numElts = sz;
elts = new int[sz];
// or: elts = new int[sz]();
for (size_type i = 0; i < sz; ++i) {
elts[i] = 0;
}
// or: std::fill(elts, elts + sz, 0);
// or: std::fill_n(elts, sz, 0);
}
void Sequence::insert(size_type position, value_type value)
{
for (size_type i = 0; i < numElts; ++i) {
if (i == position) {
elts[i] = value;
break;
}
}
}
Однако insert()
можно значительно упростить, удалив весь цикл:
void Sequence::insert(size_type position, value_type value)
{
// NOTE: checking for '>= 0' can be skipped if size_type is unsigned ...
if ((position >= 0) && (position < numElts)) {
elts[position] = value;
}
}