Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++向数组中添加对象_C++_Arrays_Stack - Fatal编程技术网

C++向数组中添加对象

C++向数组中添加对象,c++,arrays,stack,C++,Arrays,Stack,我需要实例化一个对象并将其添加到数组中。这是我目前在一个方法中拥有的: Row r; rows[count] = r; 这里的问题是r在堆栈上,并且在函数退出后被删除。我的快速解决办法是使r静态,但这是坏的,对吗?我该怎么办?对不起,完成C++ NoOB。< /P> 编辑:删除行的解构器修复了问题。在这种情况下,您实际上是在堆栈上创建它,然后将对象复制到位置行[count]。请注意,如果将行创建为行对象的数组,则在该位置已经有一个使用默认构造函数创建的行对象被复制 由于各种原因,在C++中,我

我需要实例化一个对象并将其添加到数组中。这是我目前在一个方法中拥有的:

Row r;
rows[count] = r;
这里的问题是r在堆栈上,并且在函数退出后被删除。我的快速解决办法是使r静态,但这是坏的,对吗?我该怎么办?对不起,完成C++ NoOB。< /P>
编辑:删除行的解构器修复了问题。

在这种情况下,您实际上是在堆栈上创建它,然后将对象复制到位置行[count]。请注意,如果将行创建为行对象的数组,则在该位置已经有一个使用默认构造函数创建的行对象被复制

由于各种原因,在C++中,我们尝试使用标准的库容器,如STD::vector和STD::List.这些将展开以处理您添加的新元素。

行[count]=r将对象r复制到数组中索引计数处的元素。之后,不管r发生了什么,数组都不会受到影响

[编辑:好的,这间接关系到r发生了什么-因为副本使用了r可以删除的内容。]

如果您习惯使用Java,例如,数组元素实际上不是一个对象,它只是对一个对象的引用,这是令人惊讶的。

使用std::vector而不是数组,前提是行的构造并不困难:

std::vector<Row> rows;

Row r;
rows.push_back(r);


什么不起作用?类行是否释放其析构函数中的任何内容,如果是,它是否有一个运算符=来复制它所持有的任何内容?是的,行释放它所持有的数组,而没有运算符=。行类被破坏-当你复制一个对象时,你复制了它的指针,但这并不能阻止原始类删除指针指向的对象。困难的解决方法是实现操作符=和复制构造函数。简单的解决方法是使用一个向量而不是一个分配的数组,这样在Row的析构函数中就不需要做任何事情了。没问题。顺便说一句,aaa已经足够了aaa carp是我的独角兽时刻。@Louis如果你的类有一个非平凡的析构函数,它还必须实现一个复制构造函数和一个赋值运算符才能正常工作。这被称为“三个规则”(Rule of Three):它的存在正是为了避免类似的问题。您的类中是否有new/delete?行的解构器删除数组,这就是导致问题的原因。正在尝试向已释放的数组添加内容。请描述问题的症状,好吗?可能是你误诊了原因。这是很容易用C++做的!编辑:删除行的解构器修复了问题。-不,它不能解决问题,它只是让问题变得不同。那个破坏者在那里是有原因的,对吧?防止内存泄漏。如果你想写C++,你真的需要阅读一个C++教程。“这不是一种可以通过猜测而正确表达的语言。”史蒂夫·杰索普同意@Louis特别需要专注于拷贝构建和分配。
const Row& last = rows.back();
size_t count = rows.size();
const Row& last = rows[count - 1];