【问题标题】:Making an instance inside its definition [duplicate]在其定义中创建一个实例[重复]
【发布时间】:2013-02-19 17:34:11
【问题描述】:

如何在其定义中创建类的实例?

class Test{
  Test _test;
};

这会抛出

error: field _test has incomplete type

使用指针是可行的,但我想尽可能避免使用指针。

【问题讨论】:

  • 你为什么要这样做?
  • 你不能,或者你得到实例。
  • 您认为它会如何工作? Test 的大小是多少?
  • 我认为您是在向我们询问您想到的解决方案,而不是您尝试解决的问题。为什么你认为你需要一个实例?
  • `Test& get_innermost_instance() { return this->_test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test。 _test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test。 _test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test。 _test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test._test。 _test.

标签: c++


【解决方案1】:

想象一下你可以做这样的事情:这将是一个递归定义。 Test 类型的对象包含 Test 类型的对象,其中包含 Test 类型的对象,依此类推,直到您或您的编译器发疯为止。

我真的不认为你会想要这样的东西,即使它已编译。另一方面,使用指针是可以的,原因有两个:

  • 指针可以为空,从而破坏Test 对象的无限递归链(在运行时将占用无限空间);
  • 指针具有固定大小,因此编译器无需计算 Test 的大小即可计算 Test 本身的大小(导致编译时无限递归)。

使用指针是可行的,但我想尽可能避免使用指针。

如果您担心手动内存管理,只需使用智能指针即可:

#include <memory>

class Test
{
    std::unique_ptr<Test> _test;
};

【讨论】:

    【解决方案2】:

    回答这个问题:你的班级有多大?

    我能想到的唯一两种解决方案是使用指针:

    class Test
    {
    public:
        Test * data;
    };
    

    此解决方案在高级结构中很常见,例如列表或树。 另一种方法是将内部字段声明为静态:

    class Test
    {
    public:
        Test(int i);
    
        static Test data;
    }
    
    Test Test::data = Test(5);
    

    此解决方案对于单件、多件或similar structures 很常见。但请注意,您只能从类中访问该字段,而不能从其实例中访问:

    Test test = Test::data;
    

    【讨论】:

      【解决方案3】:

      您的测试尚未定义完成,那么您如何创建它的实例。当然你可以创建指针。因为指针是不完全类型。 这就是为什么 Singleton 类和链接列表有指向它们的引用的指针,而不是完整的对象本身。

      【讨论】:

        【解决方案4】:

        类变量的内存是在创建类的对象时初始化的。但是,如果仅在其定义中创建类的对象,那么在此期间编译器将无法初始化类的变量,因为此时类的定义尚未完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多