如何在其定义中创建类的实例?
class Test{
Test _test;
};
这抛出
error: field _test has incomplete type
使用指针是可行的,但我想尽可能避免使用指针。
如何在其定义中创建类的实例?
class Test{
Test _test;
};
这抛出
error: field _test has incomplete type
使用指针是可行的,但我想尽可能避免使用指针。
想象一下你可以做这样的事情:这将是一个递归定义。一个类型Test
的对象包含一个类型的对象Test
,它包含一个类型的对象Test
,依此类推,直到你或你的编译器发疯。
我真的不认为你会想要这样的东西,即使它已经编译了。另一方面,使用指针是可以的,原因有两个:
Test
对象链(在运行时将占用无限空间);Test
来计算Test
自身的大小(导致编译时无限递归)。使用指针是可行的,但我想尽可能避免使用指针。
如果您担心手动内存管理,只需使用智能指针:
#include <memory>
class Test
{
std::unique_ptr<Test> _test;
};
回答这个问题:你的班级有多大?
我能想到的唯一两种解决方案是使用指针:
class Test
{
public:
Test * data;
};
此解决方案在高级结构中很常见,例如列表或树。另一种方法是将内部字段声明为静态:
class Test
{
public:
Test(int i);
static Test data;
}
Test Test::data = Test(5);
这种解决方案对于单件、多件或类似结构很常见。但请注意,您只能从类中访问该字段,而不是从其实例中访问:
Test test = Test::data;
类变量的内存是在创建类的对象时初始化的。但是,如果仅在其定义中创建类的对象,那么在此期间编译器将无法初始化类的变量,因为此时类的定义尚未完成。
您的测试尚未定义完成,那么您如何创建它的实例。当然你可以创建指针。因为指针是不完全类型。这就是为什么 Singleton 类和链接列表有指向它们的引用的指针,而不是完整的对象本身。