【问题标题】:Nested struct in C++C++中的嵌套结构
【发布时间】:2018-08-17 12:01:40
【问题描述】:

我尝试使用以下struct 声明编写程序:

struct N
{
    int value;
    N Left;
    N Right;
};

如果可能的话,我的程序中将有无限数量的结构。我仍然希望我的 LeftRight 具有与 N 完全相同的结构。有没有办法做到这一点?

【问题讨论】:

  • 你知道这是不可能的,你甚至知道为什么这是不可能的,但你还在寻找方法吗?
  • 递归。 “Pete 和 Repeat 在一条船上。Pete 掉了下来。剩下的是谁?” 编译器如何知道何时停止递归布局?

标签: c++ struct


【解决方案1】:

要构建树状结构,您可以使用指针:

struct N {
    int value;
    N *left;
    N *right;
};

你也可以使用参考:

struct N {
    int value;
    N &left;
    N &right;
};

但是这样你需要小心地绑定元素中没有任何一个分支(或两者都有)的引用。

或其他间接类型:unique_ptrshared_ptrreference_wrapper

此外,您可以拥有一大堆子引用:

struct N {
    int value;
    std::vector<std::reference_wrapper<N>> branches;
};

【讨论】:

  • 不,您不能使用引用。引用必须在其初始化(构造)时绑定到有效对象。因此,这将导致无效的引用。
  • @GillBates 他们可以,如果他们使用构造函数的话。但它可能不会很有用。
  • @GillBates N wat{42, wat, wat};?或者声明一个external N null; 和默认leftright 给它?
  • 可以,但可以反弹。顺便说一句,定义一个 具有 null 状态的引用包装器并不难。
【解决方案2】:

我想我得到了你的目标。您需要一个了解其邻居的结构。在这种情况下,请改用指针。

struct N
{
    int value;
    N* Left;
    N* Right;
};

【讨论】:

    【解决方案3】:

    在您的情况下发生的是编译器正在尝试生成您的结构,但由于无限递归而无法生成:sizeof(N) = sizeof(int) + sizeof(N)

    解决此问题的一种方法是使用指向 N 的指针。现在:sizeof(N) = sizeof(int) + 2*sizeof(N*) 已定义。

    struct N { int value; N *left, *right; };
    

    如果你使用C++17,你也可以使用std::optionalstd::reference_wrapper

    struct N { int value; std::optional<std::reference_wrapper<N>> left, right; };
    

    不要使用引用。 引用必须在初始化期间绑定,并且必须绑定到有效对象。因此,您的某些引用肯定是无效的(因为树不是无限的)。

    【讨论】:

    • optional 示例不正确,它也将具有无限大小(optional 就像附加了有效性标志的类型)
    • @M.M 你是对的。我认为它是作为指针实现的:)。 std::optional&lt;std::reference_wrapper&lt;T&gt;&gt; 觉得怎么样?
    • 合法,但我并没有真正看到与N * 相比的优势。 (它可能会使用更多的存储空间,并且访问起来更麻烦,没有明显的好处)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多