【问题标题】:Why structure can not contain Instance of itself? [duplicate]为什么结构不能包含自身的实例? [复制]
【发布时间】:2012-02-20 11:38:49
【问题描述】:

我读到了 c++ 中的结构,它不能包含自身的实例。 谁能帮我理解为什么它不能包含自身的实例?

【问题讨论】:

标签: c++ structure


【解决方案1】:

因为它会占用“无限”存储空间,因为它在初始化时会递归初始化自身。但是,您可以存储指向相同结构的指针。

例如这是无效的:

struct a
{
    int someVar;
    a bad;
};

这是有效的(假设你想要这个结构的链表):

struct a
{
    int someVar;
    a* good;
};

【讨论】:

    【解决方案2】:

    因为要创建它的实例,您需要创建变量,它本身就是它的一个实例 - 它将调用构造函数。

    这将导致对构造函数的无限递归调用。

    假设class A 有一个名为a 的实例变量:
    调用A 的构造函数将导致a 的初始化,它本身就是一个A。为此 - 将再次调用 A 的构造函数。

    请注意,它甚至不会编译,因为编译器无法为其分配内存,它不知道为每个对象分配多少空间。存储实例变量a需要多少空间? [任何有限的空间都是不够的,因为总会有一个额外的变量也需要分配]

    【讨论】:

    • "存储实例变量 a 需要多少空间" - 作为一种特殊情况,只要 A 没有其他数据成员或占用空间的基类,任何大小都可以使用。但仅在无用的情况下才允许这样做是不值得的。
    • 需要指出的是,你可以动态创建一个实例,并将指向它的指针存储在同一个结构体中,基本上是创建一个前向列表。 struct S{ int data; S* next; }
    • 那么java是如何工作的呢?
    • @Learner Java 对象分配是引用。 class A { A a; } 表示引用了A,而不是对象本身。这意味着您无需在其中分配A,您的构造函数也不必分配(并递归调用其构造函数)。
    【解决方案3】:
    struct bedroom
    {
        bed b;
        table t;
        bedroom r;
    };
    

    您现在看到问题了吗?一间卧室需要存储无限量的床和桌子。

    【讨论】:

    • 但一路下来都是乌龟!
    • 你卧室的桌子在做什么?
    • @sbi:把我的 C++ 书放在上面?
    • @Fred:你不把它们放在枕头下吗?
    • @FredOverflow:你不需要所有的在你的卧室里一直。此外,无论如何,半坐姿睡觉更适合你的头饰。
    【解决方案4】:

    因为那样会导致无限递归。例如

    struct foo
    {
        int boo;
        foo f;
    };
    
    foo f;
    

    foo 将包含一个 foo,其中包含一个 foo 等...

    要绕过它,您应该使用指针:

    struct foo
    {
        int boo;
        foo* f;
    };
    

    【讨论】:

      【解决方案5】:

      不只是结构,任何不完整的数据类型都不能在其中使用。 假设您有一个结构 A 并且您包含与成员相同的结构,现在当编译器尝试为其分配内存时,它如何知道分配多少,因为您在其中声明了尚未完全定义的结构 A,并且它会抛出错误不完整的数据类型不允许。

      【讨论】:

        【解决方案6】:

        正如其他答案所指出的,结构不能包含自身的实例,因为这会在创建结构时导致无限递归。然而,一个结构可以包含一个指向自身的指针:

        struct foo
        {
            int boo;
            foo *f;
        };
        
        foo f;
        f.f = &f;
        

        【讨论】:

          【解决方案7】:

          因为不可能为这种结构创建内存布局。如果struct foo 包含intfoo,您如何将sizeof(int)+sizeof(foo) 字节放入sizeof(foo) 字节中?方程A+B=A 没有任何A,B > 0 的解。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-07
            • 1970-01-01
            • 1970-01-01
            • 2011-12-16
            • 2011-06-03
            • 1970-01-01
            相关资源
            最近更新 更多