Вот что сработало для меня, по крайней мере, для входа в исходный код Android SDK:
build.gradle
вашего приложения и установите значение compileSdkVersion
соответственно. compileSdkVersion
назад. Ваш конструктор выделяет массив очень хорошо (хотя убедитесь, что остальная часть вашего класса правильно реализует правило 3/5/0 ), но он не заполняет массив какими-либо начальными значениями .
Ваш insert()
, с другой стороны, имеет несколько проблем:
он проходит через 1 слишком много элементов. Массивы имеют индекс 0, что означает, что допустимыми индексами будут 0..sz-1
, поэтому вам нужно использовать <
вместо <=
в цикле.
elts[i];
на самом деле не делает ничего значимого. Он просто читает значение из массива (в случае, когда значение 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;
}
}