Почему мой конструктор последовательности не работает должным образом? - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время я работаю над проектом на C ++, где я должен создать последовательность, а затем выполнять функции над ней.Тем не менее, я столкнулся с проблемой с моим конструктором, и я не могу понять, что с ним не так.Новая последовательность не создается.Я использую массив для реализации моей последовательности.Кроме того, я считаю, что проблема может быть и в моей функции insert().

Вот мой конструктор:

Sequence::Sequence(size_type sz)
{
    numElts = sz;
    elts = new int[sz];
}

Это моя функция вставки:

void Sequence::insert(size_type position, value_type value)
{
    for (int i = 0; i <= numElts; i++) {
        elts[i];

        if (i = position) {
            elts[i] = value;
        }
    } 
}

1 Ответ

0 голосов
/ 21 февраля 2019

Ваш конструктор выделяет массив просто отлично (хотя убедитесь, что остальная часть вашего класса правильно реализует правило 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;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...