C++ 如何让一个类使用STL容器/智能指针保存自己的数组?
所以我基本上想这样做:C++ 如何让一个类使用STL容器/智能指针保存自己的数组?,c++,oop,c++11,stl,std,C++,Oop,C++11,Stl,Std,所以我基本上想这样做: struct A { A *children[10]; }; 但是,当我执行此操作并创建析构函数时,例如: virtual ~A() { for (A *child: children) { delete child; } } 我有一个分割错误,我不知道为什么。那么,如何使用STL类在一个文件中保存一个列表,这样我就不必担心新建/删除了?我尝试了vector并得到了一个“不完整类型”错误。 在
struct A {
A *children[10];
};
但是,当我执行此操作并创建析构函数时,例如:
virtual ~A() {
for (A *child: children) {
delete child;
}
}
我有一个分割错误,我不知道为什么。那么,如何使用STL类在一个文件中保存一个列表,这样我就不必担心新建/删除了?我尝试了vector并得到了一个“不完整类型”错误。
中,您可能应该迭代子对象
,而不是A
std::vector
中,而不是原始数组(您选择的std::vector(如std::shared_ptr
)中,而不是原始指针中,这样您就不必删除任何内容
显式引用(
&
)这意味着在循环的每次迭代中,child
将是对children
数组中的共享\u ptr
的引用,而不是副本。因此,当您分配给它时,它将修改数组。您是否尝试将问题向量化为包含a,对于您的示例来说,a应该不超过20行。在C++17
中,您可以编写struct A{std::vector children;}
;而不必担心不完整的类型。这可能不会立即有帮助,但如果您的系统允许,升级到最新标准会有所帮助:)在这里显示的代码中,指针尚未初始化,因此每个删除都会产生未定义的行为。您的第一个循环“按值”迭代。它不会更改a.get()->孩子们
array,与您显然相信的相反。回过头来看,在得到答案后,您不能只问一个新问题来代替旧问题。问一个新问题。谢谢,我知道了如何使用stl容器,但是遇到了初始化问题,请参阅更新question@BeardMagician不要改变规则继续做一些完全不同的事情。改为问一个新问题。所以问题完全改变了,你的答案适合新问题,我的答案适合旧问题。我在这里该怎么做,回滚更改的编辑?放弃?
for (shared_ptr<A> child: a.get()->children) {
for (shared_ptr<A> &child: a.get()->children) {