Установка для последнего элемента значения NULL - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть массив класса объектов, и я хочу присвоить последним индексам значение NULL. У меня есть следующий код, но он выдает ошибку

DNA - это класс

allRightSequences - это вектор

DNA* newDNA = new DNA[allRightSequences.size()];

newDNA [allRightSequences.size()] = NULL; << this line gives an error

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Что вы, возможно, захотите (хотя пока не уверены в этом вопросе), это массив указателей на объекты ДНК.То, что вы объявляете, это «просто» массив объектов ДНК;и вы не можете установить объект равным нулю, как ответ Пита Беккера очень хорошо объясняет.

Следующий код будет работать:

// notice how we use +1 here to have place for the NULL element at the end
DNA* newDNA[] = new DNA*[allRightSequences.size()+1];  
newDNA [allRightSequences.size()] = NULL;

Для каждого элементамассив, однако вам также необходимо создать объект ДНК через new DNA... затем ...

Обратите внимание, что если вы используете компилятор, поддерживающий C ++ 11, используйте nullptr вместо NULL,И если вы хотите полностью избежать проблем с указателями, вы можете использовать такую ​​конструкцию, как std::optional, если вы используете C ++ 17 или boost::optional для более ранних версий, как описано в этот ответ на другой вопрос , как упомянуто Baum mit Augen выше.

Кроме того, хороший вопрос заключается в том, что вам действительно нужен нулевой указатель в конце - если это просто для определения последнего элемента при итерации по массиву, то вы можетелучше использовать std::vector<DNS> или аналогичный тип коллекции ...

0 голосов
/ 14 декабря 2018

Используйте следующий код:

newDNA [allRightSequences.size()-1] = NULL;

Поскольку индекс массива в C ++ изменяется от 0 до n-1, где allRightSequences.size() в вашем случае возвращает n, где n -размер массива.

0 голосов
/ 14 декабря 2018

NULL - это макрос, который в соответствующих ситуациях расширяется во что-то, что можно рассматривать как константу нулевого указателя.Таким образом, вы можете использовать его для установки значения указателя:

int *ip = NULL; // okay

Однако, newDNA не содержит указателей;он содержит объекты типа DNA.Забудьте массив на мгновение.Проблема заключается в следующем:

DNA dna = NULL;

Это не сработает, если только DNA не имеет конструктора, который можно вызывать при любом расширении NULL.

Если вам действительно нужноесть маркер в конце массива, который вам нужен для создания массива указателей .Но вам действительно это не нужно.Используйте std::vector<DNA>, который отслеживает размер для вас.

0 голосов
/ 14 декабря 2018

allRightSequences.size() - это не последний индекс массива, который содержит allRightSequences.size() элементов.Последний индекс allRightSequences.size() - 1.Поведение доступа к массиву вне границ не определено.

Другая потенциальная проблема: должен существовать соответствующий оператор присваивания для назначения указателя на объект DNA.Если вы не определили такой оператор, присваивание некорректно.

...