如何在其定义中创建类的实例?
class Test{
Test _test;
};
抛出
error: field _test has incomplete type
使用指针有效,但我想尽可能避免使用指针。
答案 0 :(得分:8)
想象一下你可以这样做:这将是一个递归定义。类型为Test
的对象包含类型为Test
的对象,其中包含类型为Test
的对象,依此类推,直到您或您的编译器发疯为止。
我真的不认为你会想要这样的东西,即使它被编译了。另一方面,使用指针是可以的,原因有两个:
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)
当创建类的对象时,将初始化类变量的内存。但是如果一个人只在其定义中创建了该类的对象,那么在此期间编译器将无法初始化该类的变量,因为此时该类的定义尚未完成。