我有这堂课:
class obj
{
public:
obj()
: parent(nullptr),
depth(0)
{ }
obj* parent;
list<obj> children;
int depth; // Used only for this example
};
为了填充我的数据结构,我使用如下递归函数:
void recursive(obj& parent)
{
if(parent.depth == 1)
return;
obj son;
son.parent = &parent;
son.depth = parent.depth + 1;
recursive(son);
parent.children.push_back(son);
}
以这种方式为例:
obj root;
recursive(root);
如果您注意,您会看到递归函数中的测试是否是:
if(parent.depth == n)
return;
使用n >= 2
此代码将不起作用(root->son->son
一旦退出递归函数,“孙子”父级的存储地址等将不是有效地址)。
解决此问题的一种方法是使用指针列表 ( list<obj*> children
) 而不是值列表:
void recursive(obj& parent)
{
if(parent.depth == 2)
return;
obj* son_ptr = new obj();
son_ptr->parent = &parent;
son_ptr->depth = parent.depth + 1;
recursive(*son);
parent.children.push_back(son_ptr);
}
是否有另一种方法可以完成相同的工作并将obj
s 存储在值列表中而不是指针列表中?