C++ 将最后一个元素设置为NULL

C++ 将最后一个元素设置为NULL,c++,oop,dynamic-memory-allocation,C++,Oop,Dynamic Memory Allocation,我有一个对象类数组,我想把最后一个indexi赋值为NULL 我有以下代码,但它给出了一个错误 DNA是一个类 allRightSequences是一个向量 DNA* newDNA = new DNA[allRightSequences.size()]; newDNA [allRightSequences.size()] = NULL; << this line gives an error DNA*newDNA=newDNA[allRightSequences.size()];

我有一个对象类数组,我想把最后一个indexi赋值为NULL 我有以下代码,但它给出了一个错误

DNA
是一个类

allRightSequences
是一个向量

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

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

newDNA[allRightSequences.size()]=NULL
allRightSequences.size()
不是包含
allRightSequences.size()
元素的数组的最后一个索引。最后一个索引是
allRightSequences.size()-1
。未定义越界访问数组的行为


另一个潜在问题:必须存在一个适当的赋值运算符才能将指针赋给
DNA
对象。除非您定义了这样的运算符,否则赋值形式不正确

使用以下代码:

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

因为C++中的数组索引从<代码> 0代码>代码> N-1 ,其中代码< > ArrRealStord.siz()/Case>在您的情况下返回代码> n< /代码>,其中代码> n>代码>是数组的大小。

<代码> null <代码>是一个宏,在适当的情况下,将扩展为可以视为空指针常量的内容。因此,您可以使用它设置指针值:

int *ip = NULL; // okay
但是,
newDNA
不包含指针;它包含
DNA
类型的对象。暂时忘记阵列。问题是:

DNA dna = NULL;
这是行不通的,除非
DNA
有一个构造函数,可以用
NULL
扩展成的任何内容调用它

如果确实需要在数组的末尾有一个标记,则需要创建一个指针数组。但是你真的不需要这个。使用
std::vector
,它可以为您跟踪大小。

您可能想要的(尽管从问题中还不确定),是一个指向DNA对象的指针数组。 你所说的“只是”一组DNA对象;而且不能将对象设置为null,这一点解释得很好

以下代码将起作用:

// 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;
但是,对于数组的每个元素,您还必须通过
新建DNA…
创建一个DNA对象,然后

请注意,如果使用支持C++11的编译器,请使用
NULL ptr
而不是
NULL
。 如果您想完全避免使用指针的麻烦,可以使用类似于
std::optional
的构造,以防对早期版本使用C++17或
boost::optional
,如中所述,如Baum-mit Augen所述


另外,好的问题是,您真正需要的是结尾处的零指针是什么-如果它只是为了在遍历数组时确定最后一个元素,那么您最好使用
std::vector
或类似的集合类型来代替…

为什么要尝试这样做?在末尾有一个“null”元素的目的是什么?您不能将非指针值设置为
null
?“给出一个错误”->,这将有助于包含您得到的错误消息!推荐阅读:另外,
newDNA[allRightSequences.size()]
不是最后一个元素,而是更重要的元素。这将帮助OP获得有效元素,如果他们尝试
newDNA[allRightSequences.size()-1]=NULL他们仍然会出错。@NathanOliver不一定。定义赋值运算符是可能的。最后一个答案实际上讨论了NULL赋值的错误性。define operator=()方法是因为使用newDNA[allRightSequences.size()-1]=NULL;编译器查找未定义的运算符=()方法并引发错误。而不是使用
newDNA=newDNA*[allRightSequences.size()];NeDNA(AlrRealStords.siz())=NUL/<代码>,考虑使用<代码> NeNDION=新的DNA *[AlrRealStords.siz()+ 1;改为newDNA[allRightSequences.size()]=NULL
。这样,
newDNA
包含与
allRightSequences
相同数量的可访问元素,而不是丢失1个元素。