【问题标题】:Setting the Last element to NULL将最后一个元素设置为 NULL
【发布时间】:2019-05-16 01:14:55
【问题描述】:

我有一个对象类数组,我想将最后一个 indexi 分配给 NULL 我有以下代码,但它给出了一个错误

DNA 是一个类

allRightSequences 是一个向量

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

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

【问题讨论】:

  • 你为什么要这样做?最后有一个“null”元素的目的是什么?
  • 不能将非指针值设置为NULL
  • “给出错误” -> 包含您收到的错误消息会有所帮助!
  • 推荐阅读:Is it possible to set an object to null? 另外,newDNA [allRightSequences.size()] 不是最后一个元素,而是一个更远的元素。

标签: c++ oop dynamic-memory-allocation


【解决方案1】:

NULL 是一个宏,在适当的情况下,它会扩展为可以被视为空指针常量的东西。所以你可以用它来设置一个指针值:

int *ip = NULL; // okay

但是,newDNA 不包含指针;它包含DNA 类型的对象。暂时忘记数组。问题是这样的:

DNA dna = NULL;

这行不通,除非DNA 有一个构造函数,可以用NULL 展开的任何内容来调用。

如果你真的需要在数组末尾有一个标记,你需要创建一个指针数组。但你真的不需要这个。使用std::vector&lt;DNA&gt;,它会为您跟踪大小。

【讨论】:

  • 终于有一个真正谈论NULL赋值错误的答案了。
【解决方案2】:

allRightSequences.size() 不是具有allRightSequences.size() 元素的数组的最后一个索引。最后一个索引是allRightSequences.size() - 1。越界访问数组的行为是未定义的。

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

【讨论】:

  • 虽然这将帮助 OP 获得一个有效的元素,但如果他们尝试 newDNA [allRightSequences.size() - 1] = NULL; 他们仍然会得到一个错误。
  • @NathanOliver 不一定。可以定义赋值运算符。
【解决方案3】:

您可能想要的是一个指向 DNA 对象的指针数组(尽管从问题中还不确定)。 您所声明的是“只是”一组 DNA 对象;并且您不能将对象设置为 null,正如 Pete Becker's answer 解释得很好。

下面的代码可以工作:

// 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... 创建一个 DNA 对象然后...

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

另外,好问题是你真正需要在最后的零指针 - 如果它只是在迭代数组时确定最后一个元素,那么你最好使用 std::vector&lt;DNS&gt; 或类似的集合类型而是...

【讨论】:

  • 不要使用newDNA = new DNA*[allRightSequences.size()]; newDNA[allRightSequences.size()-1] = NULL,而是考虑使用newDNA = new DNA*[allRightSequences.size()+1]; newDNA[allRightSequences.size()] = NULL。这样,newDNA 包含与 allRightSequences 相同数量的可访问元素,而不是丢失 1 个元素。
【解决方案4】:

使用以下代码:

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

因为 C++ 中的数组索引从 0 变为 n-1,其中 allRightSequences.size() 在您的情况下返回 n,其中 n 是数组的大小。

【讨论】:

  • 定义 operator=() 方法,因为使用 newDNA [allRightSequences.size()-1] = NULL;编译器找到未定义的 operator=() 方法并抛出错误。
猜你喜欢
  • 2017-03-02
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2018-07-13
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多