0

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

class Test{
  Test _test;
};

这抛出

error: field _test has incomplete type

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

4

4 回答 4

8

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

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

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

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

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

#include <memory>

class Test
{
    std::unique_ptr<Test> _test;
};
于 2013-03-05T10:45:38.913 回答
4

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

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

class Test
{
public:
    Test * data;
};

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

class Test
{
public:
    Test(int i);

    static Test data;
}

Test Test::data = Test(5);

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

Test test = Test::data;
于 2013-03-05T10:50:58.603 回答
0

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

于 2013-03-05T11:29:16.077 回答
0

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

于 2013-03-05T10:48:54.897 回答