在其定义中创建一个实例

时间:2013-03-05 10:43:00

标签: c++

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

class Test{
  Test _test;
};

抛出

error: field _test has incomplete type

使用指针有效,但我想尽可能避免使用指针。

4 个答案:

答案 0 :(得分:8)

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

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

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

使用指针有效,但我想尽可能避免使用指针。

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

#include <memory>

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

答案 1 :(得分:4)

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

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

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;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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