我试图编写一个带有以下struct
声明的程序:
struct N
{
int value;
N Left;
N Right;
};
如果可能的话,我的程序中将有无数个结构。我仍然希望我的 Left 和 Right 具有与N完全相同的结构。有没有办法做到这一点?
答案 0 :(得分:5)
要构建树状结构,可以使用指针:
struct N {
int value;
N *left;
N *right;
};
您还可以使用参考:
struct N {
int value;
N &left;
N &right;
};
但是通过这种方式,您需要在没有分支(或没有分支)的元素中仔细绑定引用。
或其他间接类型:unique_ptr
,shared_ptr
,reference_wrapper
等
此外,您还可以有一堆子裁判:
struct N {
int value;
std::vector<std::reference_wrapper<N>> branches;
};
答案 1 :(得分:2)
我认为我正在实现您的目标。您需要一个了解其邻居的结构。在这种情况下,请改用指针。
struct N
{
int value;
N* Left;
N* Right;
};
答案 2 :(得分:2)
您的情况是编译器正在尝试生成您的结构,但由于无限递归而无法:sizeof(N) = sizeof(int) + sizeof(N)
解决此问题的一种方法是使用指向N的指针。现在,定义了sizeof(N) = sizeof(int) + 2*sizeof(N*)
。
struct N { int value; N *left, *right; };
如果您使用的是C++17
,也可以使用std::optional
和std::reference_wrapper
:
struct N { int value; std::optional<std::reference_wrapper<N>> left, right; };
请勿使用引用。 引用必须在初始化期间绑定,并且必须绑定到有效对象。因此,您的某些引用注定是无效的(因为树不是无限的)。