私はこのクラスを持っています:
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
、再帰関数を終了すると有効なアドレスではなくなります)。
この問題を解決する 1 つの方法は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 を格納する別の方法はありますか?